7 Mayıs 2018 Pazartesi

maven pom.xml

maven layout
maven projenin kodlarının kendi belirlediği şekilde olmasını ister. Yapı şuna benzer.
/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/
Kaynak kodlar java/src/main dizini altında olmalı. Eski projelerde - ant tabanlı olanlarda - bu böyle değildi. Maven düzenine geçmekte fayda var.

resources dizinindeki her şey jar'ın kök dizininden başlayacak şekilde paketlenir. Dolayısıyla direkt resources altına bir dosya koymak yerine resources altına da bir dizin ağacı açmak gerekiyor.

Tag'ler
Maven plugin'leri dışında kendi ayarları için bazı tag'ler sunuyor. Bunlar şöyle.

Kendi Artifact Alanım
Şöyle yaparız.
<groupId>com.niewlabs</groupId>
<artifactId>highlighter</artifactId>
<version>1.0-SNAPSHOT</version>
build tag'i
Şöyle yaparız.
<build>
  <sourceDirectory>${basedir}/src</sourceDirectory>
  <resources>
    <resource>
      <directory>${basedir}/src</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
</build>
properties tag'i
Projenin ana sınıfının ne olduğunu belirtir. Şöyle yaparız.
<properties>        
  <start-class>mypackage.App</start-class>
</properties>
Java sürümünü belirtmek için şöyle yaparız.
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>1.8</java.version>
  <start-class>com.example.Application</start-class>
</properties>
dependencies tag'i
maven pom.xml dependencies tag yazısına taşıdım.

dependencyManagement tag'i
Ana proje (A) ve bunun B,C,D alt projeleri olsun. C ve D projelerinde alpa.jar ve beta.jar'a ihtiyaç olsun.

A projesinde dependencyManagement altında alpha.jar ve beta.jar'ı tanımlarım.
C ve D projeleri dependency olarak bu bağımlılığı belirtir ve jar'ları kullanabilirler.

B projesi ise bu bağımlılığı dependency olarak belirrmediği için beta.jarkullanmaz.

Eğer A projesinde jar'ları dependencyManagement yeriner dependency olarak belirtseydim, B projesi de otomatik olarak bu beta.jar'ı bağımlılıkları arasında kabul edecekti. Açıklaması şöyle
Artifacts specified in the <dependencyManagement> section, will only be included in the child module if they were also specified in the <dependencies> section of the child module itself. Why is it good you ask? because you specify the version and/or scope in the parent, and you can leave them out when specifying the dependencies in the child POM. This can help you use unified versions for dependencies for child modules, without specifying the version in each child module
Örnek
Önce A ve diğer projeler arasında parent ilişkisi tanılanır. Şöyle yaparız.
<project ...>

  <groupId>com.foo.bar</groupId>
  <artifactId>parent</artifactId>
  <packaging>pom</packaging>
  <version>2.3.0</version>

  <modules>
    <module>A</module>
    <module>B</module>
    </modules>

  <dependencyManagement>
    ...
  </dependencyManagement>
</project>
Alt projelerde şöyle yaparız.
<project ...>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>A</artifactId>
  <version>4.0</version>

  <parent>
    <groupId>com.foo.bar</groupId>
    <artifactId>parent</artifactId>
    <version>2.3.0</version>
  </parent>

  <dependencies>
    ...
  </dependencies>
</project>
Daha sonra A projesinde şöyle yaparız. Yani ortak tüm jar'ları belirtiriz.
<!-- Parent pom -->
<project>
  <dependencyManagement>
    <dependencies>
      <dependency> <!-- alpha -->
        ...
      </dependency>
      <dependency>
        ...
      </dependency>
      <dependency> <!-- beta -->
        ...
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>
B projesinde şöyle yaparız. beta.jar'a bağımlılık belirtilmez. Böylece üst pom'dan bu bağımlılık gelmez. Bağımlılıkların sürümünün belirtilmediğine dikkat!
<!-- Child pom -->
<project>
  <dependencies>
    <dependency>
      <groupId>alpha</groupId>
      <artifactId>alpha</artifactId>
    </dependency>
  </dependencies>
</project>
module tag'i
Açıklaması şöyle. Aslında project tag'i ile benzerdir. Alt proje gibi düşünülebilir. Genellikle projeye ait jar dosyasını üretmek için kullanılır.
When you create a module, you must specify a parent project. When you specify the parent project, it adds a <modules> section to the parent projects pom.xml. That section basically says to the parent project, "run every command I get against all of my modules first". So if you run, "mvn package" on the top level project, it will run "mvn package" against all it's module projects first.
Ben şu yapıda kullandım.
myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml
repositories tag'i
maven pom.xml repositories tag yazısına taşıdım.

scm tag'i
Şöyle yaparız.
<scm>
  <connection>scm:svn:http://myserver/myprohect/trunk/</connection>
  ...
</scm>



Hiç yorum yok:

Yorum Gönder