12 Aralık 2021 Pazar

remote-resources plugin - Modüldeki Resource Dosyalarını Paylaşmak İçin Kullanılabilir

Giriş
Bu plugin'de iki tane goal var
1. bundle
2. process

bundle
Modüldeki src/main/resources altındaki Resource Dosyalarını Paylaşmak İçin Kullanılabilir. generate-resources safhasında belirtilen dosyaları bundle haline getirir.
Örnek
Resource Bundle olan projede şöyle yaparız
<plugin>      
  <artifactid>maven-remote-resources-plugin</artifactid>
  <version>1.1</version>
  <executions>
    <execution>
      <goals>
        <goal>bundle</goal>
      </goals>
      <configuration>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>
Açıklaması şöyle
You now should see the following message in your mvn output while running mvn clean install.
[remote-resources:bundle {execution: default}]

This produces a /target/classes/META-INF/maven/remote-resources.xml file which contains references to the resource files. For example,
<remoteresources>
    <remoteresource>test.xml</remoteresource>
</remoteresources>
Resource Bundle dosyasını kullanmak isteyen modülde şöyle yaparız
<plugin>      
  <artifactid>maven-remote-resources-plugin</artifactid>
  <version>1.1</version>
  <executions>
    <execution>
      <goals>
        <goal>process</goal>
      </goals>
      <configuration>
        <resourcebundles>
          <resourcebundle>com.lorenzen:lorenzen-core:${pom.version}</resourcebundle>
        </resourcebundles>
      </configuration>
    </execution>
  </executions>
</plugin>
Açıklaması şöyle
You now should see the following message in your mvn output while running mvn clean install.

[remote-resources:process {execution: default}]

You should now be able to look into your second modules /target/classes directory and see test.xml.
Örnek
Resource Bundle olan projede şöyle yaparız
<plugin>
  <artifactId>maven-remote-resources-plugin</artifactId>
  <version>1.7.0</version>
  <executions>
    <execution>
      <goals>
        <goal>bundle</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <includes>
      <include>**/*.ddl</include>
      <include>**/*.sql</include>
    </includes>
  </configuration>
</plugin>
Resource Bundle dosyasını kullanmak isteyen modülde şöyle yaparız
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-remote-resources-plugin</artifactId>
  <version>1.7.0</version>
  <configuration>
    <resourceBundles>
      <resourceBundle>org.test:shared-resources:${project.version}</resourceBundle>
    </resourceBundles>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>process</goal>
      </goals>
    </execution>
  </executions>
</plugin>























jacoco plugin - Java Code Coverage İçindir

Giriş
Code coverage verisi üretir. Açıklaması şöyle. Yani JVM kapanınca Jacoco bir dosya üretir. Bu dosyanın yolu şöyle target/jacoco-ut.exec
Jacoco comes in 2 parts:
1. Jacoco supplies a Java agent which attaches to the JVM of the running application and records all the classes/lines executed. Once the JVM terminates, the agent generates an exec file, which contains the coverage report of everything executed in the JVM’s lifetime.

2. the Jacoco plugin takes the coverage report and generates a human readable report, with a filter to exclude any libraries or dependencies.
jacoco goal listesi şöyle
help
prepare-agent
prepare-agent-integration
merge
report
report-integration
report-aggregate
check
dump
instrument
restore-instrumented-classes
prepare-agent goal
Açıklaması şöyle
The prepare-agent goal prepares the JaCoCo runtime agent to record the execution data. It records the number of lines executed, backtraced, etc. By default, the execution data is written to the file target/jacoco-ut.exec.
report goal
Açıklaması şöyle
The report goal creates code coverage reports from the execution data recorded by the JaCoCo runtime agent. Since we have specified the phase property, the reports will be created after the compilation of the test phase. By default, the execution data is read from the file target/jacoco-ut.exec, and the code coverage report is written to the directory target/site/jacoco/index.html.
Jacoco Çalışmasın istersek
Şöyle yaparız
<project>
  <properties>
    <jacoco.skip>true</jacoco.skip>
  </properties>
</project>
Komut Satırından Agent'ı Çalıştırmak

Maven İle Plugin'i Çalıştırmak
Örnek
maven ile sadece bu plugin'i çalıştırmak için şöyle yaparız.
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test 
  -Dmaven.test.failure.ignore=true
Örnek
Testleri koşup rapor çıkartmak için şöyle yaparız
mvn test jacoco:report
Şu satırı projects altına ekleriz
<reporting>
  <plugins>
    <plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
        <reportSets>
          <reportSet>
            <reports>
            <!-- select non-aggregate reports -->
              <report>report</report>
            </reports>
          </reportSet>
        </reportSets>
    </plugin>
  </plugins>
</reporting>
Örnek
maven ile verify safhasında bu plugin'i de çalıştırmak için şöyle yaparız.
mvn clean verify
1. En Basit (bare minimum) Kullanım
En Basit (bare minimum) Kullanım yazısına taşıdım

2. Konfigürasyon İle Kullanım
configuration tag global plugin veya her bir goal için tanımlanabilir

destFile tag
Açıklaması şöyle
The destFile tag is used for setting the path to the file containing the execution data.
propertyName-surefireArgLine tag
Açıklaması şöyle
This tag sets the name of the property that contains the settings for the JaCoCo runtime agent. This also sets the VM argument line when the unit tests are run.
dataFile tag
Açıklaması şöyle
The dataFile tag is used to set the path to the file containing execution data.
outputDirectory  tag
Açıklaması şöyle
This tag sets the output directory for the code coverage reports.
Örnek - destFile
Şöyle yaparıztarget/jacoco.exe dosyası üretilir. target/site/jacoco/index.html dosyası üretilir.
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.3</version>
  <configuration>
    <destFile>${jacoco.reportPath}</destFile>
    <append>true</append>
  </configuration>
  <executions>
    <execution>
      <id>coverage-initialize</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>coverage-report</id>
      <goals>
        <goal>report</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Örnek
Şöyle yaparız
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.6</version>
  <executions>
    <execution>
      <id>prepare-agent</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
      <configuration>
        <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
        <propertyName>surefireArgLine</propertyName>
      </configuration>
    </execution>
    <execution>
      <id>report</id>
      <phase>test</phase>
      <goals>
        <goal>report</goal>
       </goals>
       <configuration>
        <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>
Örnek - destFile + dataFile + outputDirectory
Şöyle yaparız. Coverage dosyasının yaratılacağı yer belirtiliyor. Report aşamasında bu dosya girdi olarak kullanılıyor
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.5</version>
  <executions>
    <execution>
      <id>pre-test</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
      <configuration>
        <propertyName>jacocoArgLine</propertyName>
        <destFile>${project.test.result.directory}/jacoco/jacoco.exec</destFile>
      </configuration>
    </execution>
    <execution>
      <id>post-test</id>
      <phase>test</phase>
      <goals>
        <goal>report</goal>
      </goals>
      <configuration>
        <dataFile>${project.test.result.directory}/jacoco/jacoco.exec</dataFile>
        <outputDirectory>${project.test.result.directory}/jacoco</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>
Örnek - destFile
Şöyle yaparız. 
<properties>
  <jacoco.reportPath>
${project.basedir}/target/cov-reports/jacoco.exec
</jacoco.reportPath>
</properties>
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.2</version>
  <configuration>
    <destFile>${jacoco.reportPath}</destFile>
    <append>true</append>
  </configuration>
  <executions>
    <execution>
      <id>coverage-initialize</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
  </executions>
</plugin>
<properties>
exclude
Açıklaması şöyle
Starting from JaCoCo 0.8.2, we can exclude classes and methods by annotating them with a custom annotation with the following properties:
- The name of the annotation should include Generated.
- The retention policy of annotation should be runtime or class.
Yani ya kendimiz ismi @Generated olan bir anotasyon yazarız ve kullanırız. Şöyle yaparız
@Documented
@Retention(RUNTIME)
@Target({TYPE, METHOD, CONSTRUCTOR})
public @interface Generated {
}
Ya da Lombok kullanıyorsak projenin kök dizininde lombok.config dosyasına şu satırı ekleriz. Böylece Lombok ürettiği tüm kodlara kendisine ait olan @Generated anotasyonunu ekler
lombok.addLombokGeneratedAnnotation = true
Örnek - exclude
Şöyle yaparız
<plugin> 
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>com/baeldung/**/ExcludedPOJO.class</exclude>
            <exclude>com/baeldung/**/*DTO.*</exclude>
            <exclude>**/config/*</exclude>
        </excludes>
     </configuration>
     ...
</plugin>
Örnek
Şöyle yaparız
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
      <excludes>
        <exclude>io/truongbn/github/jacoco/JacocoApplication.class</exclude>
      </excludes>
    </configuration>
    ...
  </plugin>
</plugins>

3. Check Goal İle Kullanım

Rapor Çıktısı
Rapor Çıktısı yazısına taşıdım

proguard plugin

Örnek
Şöyle yaparız
<plugin>       
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.3.1</version>
  <executions>
    <execution>             
      <phase>package</phase>             
      <goals>                
        <goal>proguard</goal>             
      </goals>          
    </execution>       
  </executions>       
  <configuration>          
    <proguardVersion>6.0.3</proguardVersion>
    <injar>${project.build.finalName}.jar</injar>
    <outjar>${project.build.finalName}.jar</outjar>
    <obfuscate>true</obfuscate>
    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
    <libs>             
      <lib>${java.home}/lib/rt.jar</lib>
      <lib>${java.home}/lib/jce.jar</lib>
      <lib>${java.home}/lib/jsse.jar</lib>          
    </libs>       
  </configuration>       
  <dependencies>          
    <dependency>             
      <groupId>net.sf.proguard</groupId>             
      <artifactId>proguard-base</artifactId>
      <version>6.0.3</version>          
    </dependency>       
  </dependencies>
</plugin>
proguard.cfg dosyasında proguard kuralları vardır.

maven Lifecycle Nedir

Lifecycle Nedir?
Açıklaması şöyle.
There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project's site documentation.
Yani 3 tane lifecycle vardır. Bunlar şöyle
1.  default lifecycle - projeyi derler, test eder ve kurar
2. clean lifecycle - projeyi temizler
3. site lifecycle - dokümantasyon oluşturur

Lifecycle sadece bir kavramsal bir şey olduğu için , gidip şu lifecycle'ı çalıştır diye bir şey yapamıyoruz. Ancak life cycle içindeki bir phase'i çalıştırabiliriz. 

Örnek
Bir örnek şöyle
For example, If you execute the command mvn package , then the maven execute all the phases prior to package (including package phase) in sequential order.

Also if you execute mvn clean install command, then the maven execute up to clean phase of the clean lifecycle and after that, it executes up to install phase of default lifecycle.
Default Lifecyle
mvn install yaparsak şu goal'leri görürüz. Goal'ler pluginlere göre değişebilir.
compile testCompile check checkstyle jar test-jar shade manifest run install

Phase Nedir - Lifecycle Phase'lerden Oluşur
Her lifecycle içinde phase'ler vardır. Detayları maven Phase yazısına taşıdım. Bu phase, yani safhalar belirli bir sırada tanımlı. Sırası burada. mvn komut satırından bir tane phase tetiklenebilir. Bu phase'den önce gelen tüm phase'ler de çalıştırılır.

Yani lifecycle denilen şey aslında phase'lerin hangi sırayla çalışacağını belirten bir listeden ibaret.

Goal Nedir
Her phase aşamasında, plugin'lerin o phase'deki görevi çalıştırılır. Bazen phase'deki çalıştırılacak işler birden fazla olabilir. Bu işleri metod gibi düşünelim. Bu metodlara goal denilir. Dolayısıyla plugin şöyle tanımlanır. Bu plugin generate-sources phase tetiklenince çalışır.
<plugin>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>
Plugin'e ait goal noktasını özel olarak çalıştırmanın bir diğer yolu da komut satırında plugin:goal şeklinde tetiklemek. Clean plugin'inin clean goal'ını çalıştırmak için şöyle yaparız
mvn clean:clean
default lifecycle
23 tane phase'den oluşur ancak bunların hepsi aynı anda kullanılmıyor. Hangilerinin kullanıldığı paketleme tipine göre değişiyor. Açıklaması şöyle
Each of these lifecycle phases definition always based on the packaging types.
For every packaging, the definition of lifecycle phases is different.
clean lifecycle
3 tane phase'den oluşur

site lifecycle
4 tane phase'den oluşur


war plugin - war Dosyası Üretir

Giriş
Şöyledir.
<artifactId>maven-war-plugin</artifactId>
Örnek
Şöyle yaparız
<packaging>war</packaging>
Örnek
C:\\JAR dizinindeki jar dosyasını da paketlemek için şöyle yaparız.
<build> 
 <plugins> 
  <plugin> 
   <groupId>org.apache.maven.plugins</groupId> 
   <artifactId>maven-war-plugin</artifactId> 
   <version>2.0.2</version> 
    <configuration> 
     <webResources> 
      <resource> 
      <directory>C:\\JAR</directory> 
      <targetPath>WEB-INF/lib</targetPath> 
      </resource> 
     </webResources> 
    </configuration> 
  </plugin> 
 </plugins> 
</build> 
Örnek
Bazı jar'ları paketin dışında tutmak için şöyle yaparız.
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.4</version>
  <configuration>
    <!-- ... -->
    <packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes>
  </configuration>
</plugin>

release plugin

Giriş
Açıklaması şöyle
The Maven Release Plugin simplifies the process of releasing your project by automating tasks like tagging, versioning, and deploying artifacts to a repository. This ensures a consistent and streamlined release process.
tagNameFormat tag
Örnek
Şöyle yaparız
plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <version>3.0.0-M4</version>
  <configuration>
    <tagNameFormat>v@{project.version}</tagNameFormat>
  </configuration>
</plugin>
scm tag
svn veya git'e bağlanmak için şöyle yaparız.
<scm>
  <connection>scm:svn:http://svn/myproject/trunk/MyDevel/MyApp</connection>
  <developerConnection>scm:svn:http://svn/myproject/trunk/MyApp</developerConnection>
  <url>http://svn/myproject/trunk/MyApp</url>
</scm>
distributionManagement tag
Örnek - nexus
Deploy edilecek sunucuyu tanıtmak için şöyle yaparız.
<distributionManagement>
  <repository>
    <id>MyDevelopment</id>
    <url>http://nexus:8080/nexus/content/repositories/myapp</url>
  </repository>
  <snapshotRepository>
    </id>MyDevelopment_Snapshots</id>
    <url>http://nexus:8080/content/repositories/myapp_Snapshots</url>
  </snapshotRepository>
</distributionManagement>
Nexus'a bağlanırken kullanılacak şifre ".m2/settings.xml" dosyasındadır. Şöyledir
<server>
  <id>MyDevelopment</id>
  <username>myuser</username>
  <password>mypassword</password>
</server>
Örnek
Şöyle yaparız.
<distributionManagement>
  <snapshotRepository>
    <id>...</id>
    <url>http:...</url>
  </snapshotRepository>
</distributionManagement>
Jenkins
release plugin'i Jenkins içinden kolayca kullanmak için Jenkins'e "Maven Release Plugin" kurulur.
Ayarlar ile ilgili örnek burada. Benim kullandığım ayaralr şöyle

1. Proje'de "Konfigürasyonu Düzenle" tıklanır
2. Yapılandırma Ortamı altında "Maven release build" seçilir
3. Release goals and options kutusuna "-Dresume=false release:prepare release:perform -U -DcheckModificationExcludeList=**/*.pom,pom.xml -Darguments="-DskipTests" -DignoreSnapshots=true" girilir.
4. DryRun goals and options kutusuna "-Dresume=false -DdryRun=true release:prepare -Darguments="-DskipTests" -DignoreSnapshots=true" girilir.

Jenkins kullanıcısının ".m2/settings.xml" dosyası güncellenir.

Local Snapshot Kullanmak

Örnek Şöyle yaparız <repository> <id>snapshot-repository</id> <name>Maven2 Snapshot Repository</name> &l...