29 Eylül 2020 Salı

java komutu - Uygulamayı Çalıştırır

Giriş
Söz dizimi şöyle.
java [optionsclassname [args]
Bu komutu çalıştırmak için JAVA_HOME Ortam Değişkeni'nin tanımlı olması gerekir.

java.library.path Ortam Değişkeni
Bu ortam değişkeni eğer java kodundan DLL kullanılıyorsa, DLL dosyalarının bulunduğu dizini gösterir. Linux'ta DLL yerine Shared Object (.so) dosyaları var

Linux Yöntemleri
Yöntemler şöyle
1. Call System.load to load the shared library from an explicitly specified absolute path.
Yapmayın

2. Copy the shared library to one of the paths already listed in java.library.path
Açıklaması şöyle. Yapmayın
The java.library.path is initialized from the LD_LIBRARY_PATH environment variable.
3. Modify the LD_LIBRARY_PATH environment variable to include the path where the shared library is located.
Bence en makul çözüm bu

4. Specify the java.library.path on the command line by using the -D option.
Bence en makul ikinci çözüm bu

JEP 330
JEP 330 - Running Java Files Directly  yazısına taşıdım

-add-exports seçeneği
java komutu Module Seçenekleri yazısına taşıdım

-add-modules seçeneği
java komutu Module Seçenekleri yazısına taşıdım

-classpath (ya da -cp ) seçeneği
Açıklaması şöyle.
$ java -help
    …
    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
Örnek
Şöyle yaparız.
bash$ java -classpath path/to/jars/directory MyMainClass
Örnek
Şöyle yaparız.
"%JAVA_HOME%\jre\bin\java.exe" -classpath bind MyMainClass
Örnek - Birden fazla dizin
Windows'ta tek tırnak ile şöyle yaparız. Dizinler ; karakteri ile ayrılır
java -verbose -classpath '../lib;.' bt_sim <args>
Linux'ta dizinler : karakteri ile ayrılır.

Bu seçeneği kullanmak yerine CLASSPATH ortam değişkenini kullanmak daha iyi.
bash$ export CLASSPATH="path/to/jars/directory1:path/tojars/directory2"
bash$ javac MyMainClass.java
Örnek - wildcard
Açıklaması şöyle.
Class path entries can contain the basename wildcard character *, which is considered equivalent to specifying a list of all the files in the directory with the extension .jar or .JAR. For example, the class path entry foo/* specifies all JAR files in the directory named foo. A classpath entry consisting simply of * expands to a list of all the jar files in the current directory.
Bir dizindeki tüm jar'ları dahil etmek için şöyle yaparız.
java -cp /home/acelya/*: MyMainClass
-de seçeneği
Açıklaması şöyle. disable assertions anlamına gelir.
-da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
Assertleri kapatır.

-ea seçeneği
Açıklaması şöyle enables assertions anlamına gelir.
-ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
Kod içindeki assertlerin çalışması için gerekir. Uzun hali -enableassertions seçeneğidir. Kod derleyici tarafından şu hale getirilir.
if (!cond)
    throw new AssertionError();
Eğer assert için mesaj kullanılırsa
assert d != null : "d is null";
Kod derleyici tarafından şu hale getirilir.
if ($assertionsEnabled && !(Expression1))
    throw new AssertionError(Expression2);
-D seçeneği
Parametre Geçme Seçenekleri yazısına taşıdım

-jar seçeneği - Executable Jar çalıştırmak
Açıklaması şöyle.
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
jar dosyasında Manifest varsa şöyle ve bu dosyada Main-Class satırı varsa şöyle yaparız.
java -jar path/to/jar/file
Eğer Manifest dosyası yoksa başlangıç sınıfını vermek gerekir.
java -cp path/to/jar/file MainClass
Elimizde şöyle bir dizin yapısı olsun
jar_root/
├── executable.jar
├── folder1/
    └── required_file1.txt

├── folder2/
    └── required_file2.txt

├── other_folder/
   └── ...
└── other_file.txt
executable.jar dosyasını çalıştırınca folder1/required_file1.txt dosyasını okumak istiyor olsun. Bu durumda harici bir dosya okuduğumuz için jar dosyası şöyle çalıştırılır. Önce jar'ın olduğu dizine gideriz. Sonra -jar seçeneği ile executable jar'ı çalıştırırız.
cd /path/to/jar_root/ 
java -jar executable.jar <options>
jar içindeki java kodu dosyayı muhtemelen şöyle açıyordur.
File file = new File("folder1", "required_file1")
-javaagent seçeneği
Dynamic Agent Loading yeteneği Java 21 ile deprecate ediliyor.

Örnek
Şöyle yaparız.
java -javaagent:agent.jar -jar myApp.jar
-help seçeneği
Şöyle yaparız.
$ java -help
Usage: java [options] <mainclass> [args...]
           (to execute a class)
   or  java [options] -jar <jarfile> [args...]
           (to execute a jar file)
   or  java [options] -m <module>[/<mainclass>] [args...]
       java [options] --module <module>[/<mainclass>] [args...]
           (to execute the main class in a module)
   or  java [options] <sourcefile> [args]
           (to execute a single source-file program)
--illegal-access seçeneği
Açıklaması şöyle
Since Java 16, the --illegal-access flag is set to deny by default, resulting in some calls (mainly related to reflection) being treated as illegal and throwing a beautiful java.lang.reflect.InaccessibleObjectException. In our case, we found out that the libraries Kryo (through Chill) and Aeron use low-level JDK APIs and now trigger illegal access exceptions.

We immediately spotted this issue with our test battery and fixed it by simply allowing access to these internal APIs with a set of extra parameters passed at runtime — --add-opens {package}=ALL-UNNAMED. After a session of trial and error, we came up with the correct list of packages to open. To go further on this topic we recommend looking into JEP 396 and JEP 403.
-m seçeneği
Çalıştırılacak ana sınıfı beliritr.
--module modulename[/mainclass] veya -m module[/mainclass] şeklindedir.
Örnek
Şöyle yaparız.
java --module-path mods    -m     com.test/com.test.HelloWorld
                   ^               ^         ^
           module directory  module name   main class
--module-path veya -p seçeneği
-p ile aynıdır. Açıklaması şöyle. Yani --module-path modulepath veya -p modulepath şeklindedir.
Searches for directories from a semicolon-separated (;) list of directories. Each directory is a directory of modules.
Örnek
Şöyle yaparız.
java --module-path mymods -m com.test/com.test.HelloWorld
Örnek
Moduler jar dosyasındaki modülleri listelemek için şöyle yaparız.
java -p yourModular.jar --list-modules
-noverify seçeneği
Açıklaması şöyle. Bytecode'un değişmediğini değil, zarar vermeyeceğini doğrulamaya çalışır.
When a class loader presents the bytecodes of a newly loaded Java platform class to the virtual machine, these bytecodes are first inspected by a verifier. The verifier checks that the instructions cannot perform actions that are obviously damaging. All classes except for system classes are verified. You can, however, deactivate verification with the undocumented -noverify option.
-server seçeneği
Açıklaması şöyle
-server       to select the "server" VM
                  The default VM is server.
--source seçeneği
java komutu normalde derlenmiş .class dosyalarını çalıştırır. Java 11 ile tek dosyadan oluşan (dosya içinde birden fazla class kodu olabilir) kaynak kodu çalıştırmak için de kullanılabiliyor.

-X seçeneği
-X Seçenekleri yazısına taşıdım.

-XX seçenekleri
XX Seçenekleri yazısına taşıdım.

-verbose seçeneği
Açıklaması şöyle
-verbose:[class|gc|jni]
                  enable verbose output
Daha detaylı çıktı üretir. Şöyle yaparız.
java -verbose ...
-version seçeneği
-version seçeneği yazısına taşıdım.