27 Şubat 2017 Pazartesi

SSLContext Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.net.ssl.SSLContext;
Bu sınıf https bağlantısı açmak için kullanılabilir. Şöyle yaparız.
HttpsURLConnection con = ...;
...
con.setSSLSocketFactory (sslContext.getSocketFactory()); 
constructor - apache
Şöyle yaparız.
TrustStrategy acceptingTrustStrategy = 
(X509Certificate[] chain, String authType) -> true;

SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
  .loadTrustMaterial(null, acceptingTrustStrategy)
  .build();
getInstance metodu
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("SSLv3");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLS");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
getSocketFactory metodu
Bu sınıftan SSLSocketFactory alınabilir.
sslContext.getSocketFactory()
Şöyle yapabiliriz.
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
init metodu - KeyManager
SSLContext socket yaratmadan önce ilklendirilir ve tekrar ilklendirmenin bir yolu yoktur. Bir KeyManager verebiliriz. Böylece belli bir sertifikayı kullanabiliriz.
KeyManagerFactory kmf = ...;
...
sc.init(kmf.getKeyManagers(), null, null );
init metodu - TrustManager
Bir TrustManager belirtebiliriz. Böylece hangi isim alanlarına güveneceğimiz belirtiriz. Şöyle yapabiliriz.
sslContext.init(null, new TrustManager[] { tm }, null);
İlaveten rastgele sayı üreteci de belirtebiliriz. Şöyle yaparız
sslContext.init(null, new TrustManager[] { tm },new SecureRandom());
Şöyle yaparız.
TrustManagerFactory tmf = ...;
sslContext.init(null, tmf.getTrustManagers(), null);

java komutu

Giriş
Söz dizimi şöyle
java [optionsclassname [args]
JAVA_HOME ortam değişkeni
JAVA_HOME scriptlerde kullanılmak üzere tanımlanan bir değişkenden ibaret. İsmi de geleneksel olarak böyle.

1. Tanımlama adımı
Script içinde tanımlamak istersek şöyle yaparız.
# export JAVA_HOME=...
Linux'ta sistem dosyasına yazmak istersek
/etc/environment veya ~/.bashrc dosyasına tanımlarız.

Windows'ta değişkene atanan yol şöyledir.
C:\Program Files (x86)\Java\jdk1.8.0_77
2. Daha sonra PATH'e dahil edilir (isteğe bağlı)
Linux'ta şöyle yaparız.
export PATH=$JAVA_HOME/bin:$PATH
ve java çağrılır.
java -version
3.  Ya da PATH'e dahil edilmeden kullanılır (isteğe bağlı)
Linux'ta şöyle yaparız.
${JAVA_HOME}/bin/java -version
Windows'ta şöyle yaparız.
%JAVA_HOME%\bin\java -version
CLASSPATH ortam değişkeni
Windows'ta CLASSPATH değişkenine atana yol şöyledir.
C:\...\jdk1.8.0_77\bin;C:\...\jre1.8.0_77\bin
-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.
Kullanılacak jar dosyalarının dizinini verir.
bash$ java -classpath path/to/jars/directory MyMainClass
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
-de
Açıklaması şöyle
-da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
Assertleri kapatır.

-ea seçeneği
Açıklaması şöyle
-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
JVM'e parametre geçilebilir.
-Dfoo.bar=foobar
Kodda parametreye şöyle erişilir.
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";
        }
    }
}
Ayrıca JVM'in kullanacağı locale de belirtilir.
-Duser.language=de
-Duser.country=DE
-jar seçeneği - Executable Jar çalıştırmak
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
Şöyle yaparız.
java -javaagent:agent.jar -jar myApp.jar
-server seçeneği
Açıklaması şöyle
-server       to select the "server" VM
                  The default VM is server.
-X seçeneği
Açıklaması şöyle
-X            print help on non-standard options
-XaddExports
Java 9 (Jigsaw) ile standart olmayan sun.reflect.* gibi paketleri kullanabilmek için şöyle yaparız.
java -cp classes -XaddExports:java.base/sun.reflect Test
-Xms seçeneği
Kullanılacak en az heap büyüklüğünü ayarlar. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -Xms256m ...
-Xmx seçeneği
Kullanılacak en fazla heap büyüklüğünü ayarlar. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -Xmx512m ...
-Xss seçeneği
Kullanılacak stack büyüklüğü ayarlar.

-XX:HeapDumpOnCtrlBreak seçeneği
Şöyle yaparız.
-XX:+HeapDumpOnCtrlBreak writes heap dump together with thread dump on CTRL+BREAK
-XX:HeapDumpOnOutOfMemoryError seçeneği
Açıklaması şöyle
This will create a dump which can be analysed afterwards. The dump will be located at the location given at -XX:HeapDumpPath=some_path.
Şöyle yaparız.
-XX:+HeapDumpOnOutOfMemoryError writes heap dump on OutOfMemoryError (recommended)
-XX:MaxNewSize
Young generation için kullanılan en fazla heap büyüklüğünü ayarlar.

-XX:MaxPermSize
Java 8'den itibaren kaldırıldı. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -XX:MaxPermSize=256m ...
-XX:NewSize
Young generation için kullanılan başlangıç heap büyüklüğünü ayarlar.

-XX:OnError=path_to_some_script.sh
Açıklaması şöyle
Same as -XX:OnOutofMemoryError before, but for more generic exceptions.
-XX:OnOutOfMemoryError=path_to_some_script.sh
Açıklaması şöyle
This will run a script (it must be runnable by the same user which runs the application) when the application returns an error as an OutOfMemory

-XX:+UseConcMarkSweepGC
Farklı bir garbage collector kullanmamızı sağlar. Şöyle yaparız.
-XX:+UseConcMarkSweepGC
-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
Açıklaması şöyle
-version      print product version and exit
Şöyle yaparız.
java -version
Çıktı olarak şunu alırız.
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
Eğer java kurulu değilse Ubuntu'da şu çıktıyı alırız.
~$ java -version
The program 'java' can be found in the following packages:
 * default-jre
 * gcj-5-jre-headless
 * openjdk-8-jre-headless
 * gcj-4.8-jre-headless
 * gcj-4.9-jre-headless
 * openjdk-9-jre-headless
Try: sudo apt install <selected package>