1 Aralık 2023 Cuma

Local Snapshot Kullanmak

Örnek
Şöyle yaparız
<repository>
  <id>snapshot-repository</id>
  <name>Maven2 Snapshot Repository</name>
  <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  <snapshots>
    <enabled>false</enabled>
    </snapshots>
</repository>
Şöyle yaparız
mvn -o `-Dcheckstyle.skip install

3 Ekim 2023 Salı

surefire plugin - surefirebooter Process

surefirebooter Nedir ?
Açıklaması şöyle. Yani birim testleri çalıştıran uygulama
API and Facilities used by forked tests running in JVM sub-process.
surefirebooter Uygulamasını Nasıl Görebilirim ?
mvn clean install ile testleri koşmaya başlarız. surefire çalışınca jps komutu ile çalışan java uygulamalarına bakarız. surefirebooter-abc.jar diye bir process görürüz. 

Kaç Tane surefirebooter Çalışır ?
Kaç tane çalışacağını forkCount tag ile kontrol ediyoruz. Belirtilen sayı kadar kadar surefirebooter çalışıyor

Too many open files Hatası
Linux veya MacOs ile çalışıyorsak ulimit ile açılabilecek dosya için sınır koysak bile JVM çalışırken bu sınırı değiştiriyor. Bunu gösteren bir açıklama burada. Yani bir anlamda ulimit etkin değil. JVM kendi kendine bir üst sınır koyuyor ve MacOS için bu üst sınır değeri 10240.

Bunu değiştirmek için -XX:- MaxFDLimit seçeneği kullanılır

Bu seçeneği gösteren bir örnek burada

Ben de şöyle bir kod yazdım
public static void main(String[] args) throws Exception {
  List<InputStream> streams = new ArrayList<>();
  int index = 0;
  while (true) {
    FileInputStream fileInputStream = new FileInputStream("/dev/null");
    streams.add(fileInputStream);
    System.out.println("Index " + ++index);
  }
}
MacOS'ta eğer şöyle çalıştırırsam aldığım sonuç 10235
java scratch.java
Şimdi ulimit ile üst sınır koyalım
ulimit -n 2000
Tekrar MacOS'ta eğer şöyle çalıştırırsam aldığım sonuç 1995
java  -XX:- MaxFDLimit scratch.java
Benzer bir açıklama burada
The JVM on macOS has its own built-in max open files limit, set to 10240. This limit can be removed by passing the -XX:-MaxFDLimit option to the JVM.

However, if the built-in limit is removed, the JVM starts to use the soft limit as the absolute limit. Soft limits can be set very low, which makes the JVM option seemingly not working. This should be taken into consideration when using this JVM option.
maven ile çalıştırmak için şöyle yaparız
MAVEN_OPTS="$MAVEN_OPTS -XX:-MaxFDLimit"; export MAVEN_OPTS;  
Daha sonra şöyle yaparız
mvn test -Dtest=Foo 





19 Eylül 2023 Salı

wagon plugin

Örnek
Şöyle yaparız
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>wagon-maven-plugin</artifactId>
  <version>2.0.2</version>
  <executions>
    <execution>
      <id>download-file-1</id>
      <phase>process-resources</phase>
      <goals>
        <goal>download-single</goal>
       </goals>
       <configuration>
         <url>https:/.../couchbase-kafka-connect-couchbase-4.1.11.zip</url>
         <toDir>${project.build.directory}/classes</toDir>
         </configuration>
         </execution>
       </executions>
</plugin>
Çalıştırmak için şöyle yaparız
mvn process-resources

17 Eylül 2023 Pazar

download plugin

Giriş
3 tane goal var
artifact
help
wget

wget Goal
Belirtilen dosyası indirir. Sadece <outputDirectory> ve <uri> bilgileri zorunlu. Çalıştırmak için şöyle yaparız
mvn download:wget
Eğer birden fazla wget varsa veya şöyle yaparız
mvn process-resources
Eğer logları görmek istersek şöyle yaparız
mvn download:wget -X
<cacheDirectory> Tag
İndirilen dosya <cacheDirectory> ile belirtilen yerde ön bellekte saklanır. Bu dizinin varsayılan yolu ${local-repo}/.cache/maven-download-plugin olarak. Ben kullanırken D:\Users\user\.m2\.cache\download-maven-plugin dizini altında önbellekte saklanan dosyaları gördüm

<retries> Tag
Varsayılan değer 2. Yani 2 defa indirme işlemini deniyor.

Örnek - Ortak Configuration
Şöyle yaparız. 1.7.2 bozuk
<plugin>
  <groupId>com.googlecode.maven-download-plugin</groupId>
  <artifactId>download-maven-plugin</artifactId>
  <version>1.6.8</version>
  <executions>
    <execution>
      <id>download-zip-file</id>
      <phase>process-resources</phase>
      <goals>
        <goal>wget</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <url>https://.../confluentinc-kafka-connect-datagen-0.6.0.zip</url>
    <unpack>false</unpack>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    </configuration>
  </plugin>
</plugins>
process-resources aramasında wget ile dosya ${project.build.directory}/classes dizinine indirilir. Bu dizin aslında target/classes dizinine denk gelir.

Örnek - Birden Fazla Dosya İndirme
Şöyle yaparız
<plugin>
  <groupId>com.googlecode.maven-download-plugin</groupId>
  <artifactId>download-maven-plugin</artifactId>
  <version>1.6.8</version>
  <executions>
    <execution>
      <id>download-zip-file1</id>
      <goals>
        <goal>wget</goal>
      </goals>
      <configuration>
        <url>https://.../couchbase-kafka-connect-couchbase-4.1.11.zip</url>
        <unpack>false</unpack>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
      </configuration>
    </execution>
    <execution>
      <id>download-zip-file2</id>
      <goals>
        <goal>wget</goal>
      </goals>
      <configuration>
        <url>https://.../neo4j-kafka-connect-neo4j-2.0.1.zip</url>
        <unpack>false</unpack>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>
wget  process-resources Safhasında Çalışır
mvn test ile çalıştırılan safhalar şöyle. Yani wget aslında test sahasından önce çalışıyor. Eğer bu uygun değilse başka bir safhayı yazmak gerekir.
validate                         validate the project is correct and all necessary information is available.
initialize                         initialize build state, e.g. set properties or create directories.
generate-sources                 generate any source code for inclusion in compilation.
process-sources         process the source code, for example to filter any values.
generate-resources         generate resources for inclusion in the package.
process-resources               copy and process the resources into the destination directory, ready for packaging.
compile                 compile the source code of the project.
process-classes         post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources         generate any test source code for inclusion in compilation.
process-test-sources         process the test source code, for example to filter any values.
generate-test-resources create resources for testing.
process-test-resources copy and process the resources into the test destination directory.
test-compile                 compile the test source code into the test destination directory
process-test-classes         post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes.
test




12 Eylül 2023 Salı

Predefined Properties

project
Açıklaması şöyle
${project.build.directory} 
results in the path to your "target" directory ${project.build.outputDirectory} results in the path to your "target/classes" directory

${project.name} 
refers to the name of the project

${project.version} 
refers to the version of the project

${project.groupId} 
refers to the groupId of the project

${project.build.finalName} 
refers to the final name of the file created when the built project is packaged

22 Ağustos 2023 Salı

Conflicting Transitive Dependency

Giriş
İstenilen transitive dependency sürümünü tanımlamak için kullanılabilir. Açıklaması şöyle
The point of dependencyManagement is to allow me to specify a version for transitive dependencies. 
Örnek
Şöyle yaparız
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>conflicting.group</groupId>
      <artifactId>TransitiveDependency</artifactId>
      <version>desired.version</version>
    </dependency>
  </dependencies>
</dependencyManagement>
Örnek - BOM
Şöyle yaparız. Burada Log4J2 için BOM kullanılıyor. Böylece tüm projedeki log4j sürümü değiştirilebiliyor.
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-bom</artifactId>
      <version>${log4j2.version}</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>

Örnek
Bir projede snakeyaml kütüphanesinin eski bir sürümü  transitive dependency olarak gelsin ama biz daha yeni bir sürüm kullanmak isteyelim. Şöyle yaparız
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.yaml</groupId>
      <artifactId>snakeyaml</artifactId>
      <version>1.32</version>
    </dependency>
  </dependencies>
</dependencyManagement>

13 Ağustos 2023 Pazar

Apache Ant

Giriş
Açıklaması şöyle
Ant is based on three main abstractions:

- A task is an atomic unit of work, e.g., javac to compile Java files, war to assemble a Web Archive, etc. Ant provides lots of tasks out-of-the-box but allows adding custom ones.
- A target is a list of tasks
- You can define dependencies between tasks, such as package depending on compile. In this regard, you can see Ant as a workflow execution engine.

Local Snapshot Kullanmak

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