30 Eylül 2021 Perşembe

Just In Time Compilation - JIT Çıktısını Görmek

Giriş
JIT çalışırken bazı çıktıları görebilmek mümkün. Bu çıktılar için eğer JVM yerel makinede çalışıyorsa farklı uzak makinede çalışıyorsa farklı seçenekler kullanılır

Yerel Makine
PrintCompilation Seçeneği
Açıklaması şöyle
By setting the flag -XX:+PrintCompilation we can enable some simple output regarding the bytecode to native code compilation.
Whenever a method is compiled, a line is printed to the output. Each line consists of (1) a number of milliseconds since VM started, (2) order in which method/code block is compiled, (3) compilation level cache, (4) method name.
Örnek
JIT olan kodu görmek için şöyle yaparız.
java -XX:+PrintCompilation Main
Çıktı olarak şunu alırız. Buradaki 3. sütun önemli, çünkü Compilation Level Cache değerini göster. Bu sütunda 1,2,3,4 sayıları yazar
val 1       
val 2
val 3
...
922  315    3    src.main.BasicHolder::getInstance (4 bytes)   # Method compiled
922  316    3    src.main.BasicHolder::getVALUE    (4 bytes)   # Method compiled
...
val 1563    
val 1563
val 1563
val 1563
...
2. Sütun Code Cache Durumu
Açıklaması şöyle. Yani ikinci sütunda bazen % işareti de bulunur. Yukarıdaki örnekte yok gerçi. Bu işaret kodun Code Cache içinde olduğunu gösterir.
... you can see in the 2nd column, and there is the percentage(%) symbol in front of some code blocks. That means those code blocks are in the code cache. 
3. Sütun JIT Durumu
Buradaki 3. sütun önemli. Bu sütunda 0,1,2,3,4 sayıları yazar. Açıklaması şöyle. 1,2,3 ise C1 tarafından JIT yapılmıştır. C4 ise C2 tarafından JIT yapılmıştır
In the 3rd column, you can see the stages of the code block's compilation process. Some are in level 0, which are not compiled by the JIT compiler. That means code blocks that are not re-occurred. Some code blocks are in levels 1,2, and 3, which are compiled by the C1 compiler, and some are in level 4, which are compiled by the C2 compiler.
Uzak Makine
Açıklaması şöyle
If you want to see the same information on some remote machine where you cannot see the console output you can use the following command:

java -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation <class name>

which will produce log file with compilation results in it.
Açıklaması şöyle-XX:+UnlockDiagnosticVMOptions ve -XX:+PrintInlining seçenekleri kullanılabilir.
You can enable a lot of debug information about how the compiler decides what to do with your code using feature flags like -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining

21 Eylül 2021 Salı

java komutu Parametre Geçme Seçenekleri

Giriş
JVM'e parametre geçmek için iki yöntem var
1. -D seçeneğini kullanmak
2. JAVA_TOOL_OPTIONS ortam değişkenini (environment variable) kullanmak

-D seçeneği
Örnek
Şöyle yaparız.
-Dfoo.bar=foobar
Kodda parametreye erişmek için şöyle yaparız. Yani System.getProperty() kullanılır
class Foo {
  private static final String BAR;
  static {
    String foobar = System.getProperty("foo.bar");
    if(foobar != null && foobar.length()>0) {
      BAR = foobar;
    } else {
      BAR = "somedefaultvalue";
    }
  }
}
Örnek
JVM'in kullanacağı locale'i belirtmek için şöyle yaparız.
-Duser.language=de
-Duser.country=DE
Örnek
Derleyici optimizasyonunu kapatmak için şöyle yaparız.
-Djava.compiler=NONE
JAVA_TOOL_OPTIONS seçeneği
Açıklaması şöyle
When the JVM starts it search’s for this environment variable, and uses it. You can check the output of the JVM displaying a message with the values found.
Örnek
Şöyle yaparız
export JAVA_TOOL_OPTIONS=‘-Dvar1=value1 -Dvar2=value2’

19 Eylül 2021 Pazar

Arquillian

Giriş
Açıklaması şöyle
Arquillian is a container-agnostic integration testing framework for Jakarta EE.
Kullanılabilecek container'lar şöyle
- Jakarta EE applications deployed on an application server like Glassfish or JBoss
- Servlet containers deployed on Tomcat or Jetty
- Standalone containers
- OSGI containers
Maven
Örnek
Şu satırı dahil ederiz. Daha sonra kullanılacak container dependency'leri de eklenmelidir.
<!-- Arquillian 1.7.0 adds Jakarta EE 9 and JUnit 5 support--> <arquillian-bom.version>1.7.0.Alpha10</arquillian-bom.version> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>${arquillian-bom.version}</version> <scope>import</scope> <type>pom</type> </dependency> <dependency> <groupId>org.jboss.arquillian.junit5</groupId> <artifactId>arquillian-junit5-container</artifactId> <scope>test</scope> </dependency>
Kullanım
ShrinkWrap sınıfı döndüren bir metod yazılır. Bu metoda @Deployable anotasyonu eklenir.

Örnek
Şöyle yaparız
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit5.ArquillianExtension;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;

@ExtendWith(ArquillianExtension.class)
public class GreetingServiceTest {

  @Deployment
  public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class)
      .addClass(GreetingMessage.class)
      .addClass(GreetingService.class)
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
  }

  @Inject
  GreetingService service;

  @Test
  @DisplayName("testing buildGreetingMessage")
  public void should_create_greeting() {

    var message = service.buildGreetingMessage("Jakarta EE");
    assertTrue(...);
  }
}

16 Eylül 2021 Perşembe

Jakarta EE @Stateless Anotasyonu

Giriş
Eski kodlarda şu satırı dahil ederiz.
import javax.ejb.Stateless;
Şu satırı dahil ederiz
import jakarta.ejb.Stateless;
Örnek
Şöyle yaparız
@Stateless
public class BookDao
  @PersistenceContext(unitName = "persistence-unit")
  protected EntityManager em;
...
}


13 Eylül 2021 Pazartesi

Intellij Idea ve Gradle

Intellij Idea ve Gradle
Gradle, Türkçe Locale ile çalışmayabiliyor. Hata da jacoco ile ortaya çıkıyor. Hata şöyle
java.lang.IllegalArgumentException: No enum constant org.jacoco.agent.rt.internal_c13123e.core.runtime.AgentOptions.OutputMode.fıle
O yüzden Intellij'i İngilizce locale ile başlatmak gerekebiliyor. Şöyle yaparız
Help"->"Edit Custom VM Options" açılır ve en alta
-Duser.language=en
satırı eklenir. Gradle şöyle kullanılır
.\gradlew -Duser.language=en build

Proje Yapısı
Proje Yapısı yazısına taşıdım

IntelliJ Terminal
Terminal aslında bir Power Shell terminali. Terminali iki şekilde kullanabiliriz.

1. gradle komutunu yazar ve Ctrl + Enter ile IntelliJ tarafından çalıştırılmasını isteyebiliriz.

2. Power Shell tarafından çalıştırılmasını isteyebiliriz.  gradlew.bat dosyasını çalıştırmak için Power Shell 
.\gradlew ...
şeklinde kullanmamızı istiyor. Ben en çok şunu kullanıyorum
.\gradlew build -x test
Gradle şöyle kullanılır
.\gradlew -Duser.language=en build
build.gradle Dosyası
Kullanılacak plugin'ler ve dependencies bu dosyaya yazılır

allprojects Block
Örnek
Şöyle yaparız
allprojects {
  gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
      options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
    }
  }
}

buildScript Block
Build işlemi için gereken ayarları içerir. Açıklaması şöyle
The “buildscript” block only controls dependencies for the buildscript process itself, not for the application code, which the top-level “dependencies” block controls.
Örnek
Şöyle yaparız
buildscript {
  repositories {
    google()
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:3.1.1'
  }
}
Açıklaması şöyle
But what does that block do? Basically it defines dependencies which are required for the build itself. Or in other words: It defines dependencies which are required to build your Application (whatever your “Application” is (Android App, Gradle Plugin, Swift Desktop Application…)).

In our Android example we have to define the Android Gradle Plugin dependency which helps us to build an APK:
plugins Block
Açıklaması şöyle
The “new” plugins block is not really new. It was already introduced in Gradle 2.1.
But there are some “limitations”. By default the plugin block can only resolve plugins which are either:
- Core Plugins (provides by Gradle themself). These are e.g.: org.gradle.java, org.gradle.groovy, org.gradle.java-gradle-plugin and so on…
- Published to the Gradle Plugin Portal.
war plugin yazısına bakabilirsiniz
spring-boot-gradle-plugin yazısına bakabilirsiniz

Örnek
ear çıktısı için şöyle yaparız
plugins {
id 'ear' }
Örnek
SpringBoot için şöyle yaparız
plugins {
id 'org.springframework.boot' version '2.1.2.RELEASE' }
repositories Block
Örnek ver

dependencies Block
Dependency tipleri şunlar olabilir
compile
compileOnly
implementation
testImplementation
testRuntimeOnly

compileOnly
Örnek - lombok
Şöyle yaparız
configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-data-rest'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  compileOnly 'org.projectlombok:lombok'
  runtimeOnly 'com.h2database:h2'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Custom Task Block
Örnek
Şöyle yaparız
task hello {
    doLast {
        println 'Hello Baeldung!'
    }
}
Örnek - Zip
Şöyle yaparız. build->distributions altında bir foo.zip dosyası yaratır
// Task for building the zip file for upload
task buildZip(type: Zip) {
  // set the base name of the zip file
  from compileJava
  from processResources
  into('lib') {
    from configurations.runtimeClasspath
  }
}
build.dependsOn buildZip
Custom Gradle File Block
apply from ile kendi dosyamız da dahil edilebilir.
Örnek
Şöyle yaparız
apply from: "$rootDir/gradle/utils.gradle"
settings.gradle Dosyası
settings.gradle Dosyası yazısına taşıdım

gradle/wrapper/gradle-wrapper.properties Dosyası
Bu dosyada kullanılacak gradle sürümü belirtilir. Kullanılan gradle sürümü ".gradle" dizini altında görülebilir. Kullanılmayan sürüm silinebilir.

Tasks
Eklenen plugin'ler task tanımlarlar 

application
build
build setup
distribution
documentation
help
other
verification

Intellij Build And Run
Intellij "Build and Run Using" ve     "Run tests Using" işlemleri için normalde altta gradle kullanır.







9 Eylül 2021 Perşembe

Java Agent Nedir ?

Giriş
Açıklaması şöyle
What are Java Agents?, they are basically Java libraries that include classes that implement the Java Instrumentation API. Which is available since JDK 1.5. This is a very simple API but at the same time, very powerful. It lays the foundation for application instrumentation.

The main functionality of this instrumentation is that it will allow us to add code to certain classes. And with this addition, we will be able to recompile data to be used mainly for monitoring and analysis or event logging purposes. Allowing us to obtain vital information about the application, that can help us to solve problems or obtain data that would not be possible otherwise.

The main quality of this instrumentation API is the alteration of the byte-code of the classes that are being executed by the virtual machine. Through this alteration, we will be able to perform the actions previously indicated.