resources:

Compile

    javac -d bin -sourcepath src -cp lib/lib1.jar;lib/lib2.jar src/com/example/Application.java

crea l'eseguibile bin/com/example/Application.class, che si può far girare con

    java -classpath bin;lib/lib1.jar;lib/lib2.jar com.example.Application

CLASSPATH

we provide an actual class name that java would attempt to find based on provided classpath

  1. CLASSPATH environment variable
  2. "-cp" or "-classpath" parameter is passed
  3. If CLASSPATH environment variable is not found, current folder (".") is used by default
  4. If -classpath is explicitly set as a command line parameter, it overrides all other values
  5. under linux is /usr/share/java/

in alcune verioni jvm settare "." nel CLASSPATH per accedere alle classi locali

    javac -cp .;lib/lib1.jar com/example/Application.java

the best way to have different classpath for different applications on same machine, override environment variable CLASSPATH, creating start-up script and set classpath there:

CLASSPATH=/home/tester/classes
    java -classpath $CLASSPATH TestMain
    #windows
    java -classpath C:\test\test com.test.main
    # con jar files
    java -classpath /usr/local/lib/app/test.jar com.test.main

By default CLASSPATH points to current directory denoted by "." and it will look for any class only in current directory.

In Linux, from either your .bash_profile or .bashrc (.bash_profile on every login, .bashrc, every time you open a new terminal window)

export CLASSPATH=".;lib"

test:

echo ${CLASSPATH}

real life example:

#!/bin/sh
java
    -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
    -classpath
        jakarta-oro-2.0.6.jar:
        jmdns.jar:log4j-1.3alpha-7.jar:
        log4j-chainsaw-2.0alpha-1.jar:
        log4j-optional-1.3alpha-7.jar:
        log4j-oro-1.3alpha-7.jar:
        log4j-smtp-1.3alpha-7.jar:
        log4j-xml-1.3alpha-7.jar:
        log4j-zeroconf.jar:
        xstream-1.1.2.jar
org.apache.log4j.chainsaw.LogUI
#!/bin/sh
 
# file configurazione come primo argomento
java
    -Dsystem.env=production
    -classpath $project_dir/lib/A.jar:
                $project_dir/lib/B.jar:
                $project_dir/lib/C.jar:
                $project_dir/lib/D.jar
it.EVweb.Worker.Main
$project_dir/config/config.json
#!/bin/bash
#
MAIN_CLASS=it.proj.Main
JAVA_BIN=`which java`
LIB_PATH=/path/to/app
#
JPATH=$LIB_PATH/mqserver.jar
JPATH=$JPATH:$LIB_PATH/logback-core-1.1.2.jar
JPATH=$JPATH:$LIB_PATH/logback-classic-1.1.2.jar
JPATH=$JPATH:$LIB_PATH/gson-2.3.1.jar
JPATH=$JPATH:$LIB_PATH/mysql-connector-java-5.1.34-bin.jar
JPATH=$JPATH:$LIB_PATH/javax.mail-1.5.2.jar
JPATH=$JPATH:$LIB_PATH/mailapi-1.5.2.jar
JPATH=$JPATH:$LIB_PATH/jt400.jar
#
# run the program
$JAVA_BIN -Dit.proj.log="$LOG_FOLDER" -classpath $JPATH $MAIN_CLASS

multiple JVM

JAVA_HOME

sudo nano /etc/environment
JAVA_HOME=/usr/lib/jvm/java-7-oracle
update-alternatives --config java

Variabili: Modificatori di accesso e Casting notevoli

[public|protected|private] [static] [final] Tipo identificatore [= value];

default: nel medesimo package Protected accessibile dallo stesso package e da classi figlie final inizializzata una sola volta(in dichiarazione), Al contrario delle costanti, il valore delle variabili final non è necesariamente noto a compile-time, usato su metodo, rendere non ridefinibile dalle sottoclassi costanti: contempraneamente final static

String a = String.valueOf(2);   // integer to numeric string
int i = Integer.parseInt(a);    // numeric string to an int
 
 
double d = 10.0;
float f = (float) d;
d = (double) 5;
float r= (float) x  / (float) y;

la divisione tra interi, ritorna un valore intero.

ogni classe pubblica (public class) deve essere contenuta in un file con nome uguale al nome della classe: es. MiaClasse deve trovarsi nel file MiaClasse.java

convenzione: i nomi delle classi inizino con un carattere maiuscolo e siano CamelCase

mkdir -p it/ev/prj
java it.ev.prj.MiaClasse
javac MiaClasse.java
package it.ev.prj;
public class MiaClasse {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}

con jar libs:

jar cf mylib.jar it
java -cp mylib.jar:mylib2.jar it.ev.prj.MiaClasse

su Windows i file .jar devono essere separati da ';', ':' x Unix

Collections

Array ha il limite notevole di non poter cambiare dimensione (size) dopo la creazione

string[] as = new String["1","2","3"];
new String[]{"a","b","c","d"};
int[] numeroGiorniPerMese = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int[][] a_i = new int[][] = {
            { 1, 2, 3 },
            { 4, 5, 6 }
};

java.lang.Arrays contiene algoritmi per sorting e search

  • ArrayList
  • Vector (sincronizzato)
  • HashMap
  • HashSet (senza duplicati)
  • Hashtable (sincronizzato)
Queue<String> ll = new LinkedList<String>();
for(Iterator<String> si=ll.iterator(); si.hasNext(); ) {
    String str = si.next();
}
for(String str:ll) {
 
}
 
Collection<string> a = new ArrayList<String>();
// popola
for(String s:args) { a.add(s); }
// itera
for(String tmp:a) { System.out.println(tmp); }
// i compilatori moderni avvisano che le arrylist vanno sostituite con i Generics Type-Safe
@SuppressWarnings
public static void test_al(){
    Collection list = new ArrayList();
    list.add("test");
    list.add(new Integer(5)); // a runtime avverrà un ClassCastException
 
    Iterator it=list.iterator();
    while(it.hasNext()){
        String s = (String) it.next();
    }
}
 
Collection<String> lista = new ArrayList<String>();
lista.add("test");
lista.add(new Integer(5)); // errore in fase di compilazione
 
Iterator<String> it=lista.iterator();
while(it.hasNext()){
    String tmp = it.next(); // Non è necessario il cast
}
Map<Integer, String> m = new HashMap<Integer, String>();
mappa.put(2, "test");
public static void printAll(Collection<?> list){
}
import java.util.ArrayList;
import java.util.List;
public class Customer {
    static public ArrayList<Customer> allCustomers = new ArrayList<Customer>();
    public Integer id = 0;
    public Customer() {}
    public static List<String> getEnabledCustomerNames() {
        ArrayList<String> outList = new ArrayList<String>();
        for(Customer customer : Customer.allCustomers) {
            if(customer.enabled) {
                outList.add(customer.name);
            }
        }
        return outList;
    }
}

String

String s = "a string";
int s = s.length();
 
"" + String.valueOf(length);
 
String titolo = "I promessi Sposi";
String a = titolo.substring(2);   // a vale "promessi Sposi"
String c = titolo.substring(2,9); // c vale "promessi"
 
String messaggio = "Ciao XX";
messaggio.replace("XX", "Mondo");
boolean contains(CharSequence s)
boolean equals(Object anObj)
boolean isEmpty()
String[] split(String regex)
String trim()
 
// per creare testi di grandi dimensioni: StringBuffer  StringBuilder

Annotations

@Override
@SuppressWarnings({"deprecation"})

Varargs

public class TestClass {
    public testMethod(int id, String... var) {
        // accedi come se String[] var
    }
}

Exceptions

Eccezioni Errori
ArithmeticException AbstractMethodError
ArrayIndexOutOfBoundsException ClassCircularityError
ArrayStoreException ClassFormatError
ClassCastException Error
ClassNotFoundException ExceptionInInitializerError
CloneNotSupportedException IllegalAccessError
Exception IncompatibleClassChangeError
IllegalAccessException InstantiationError
IllegalArgumentException InternalError
IllegalMonitorStateException LinkageError
IllegalStateException NoClassDefFoundError
IllegalThreadStateException NoSuchFieldError
IndexOutOfBoundsException NoSuchMethodError
InstantiationException OutOfMemoryError
InterruptedException StackOverflowError
NegativeArraysizeException ThreadDeath
NoSuchFieldException UnknownError
NoSuchMethodException UnsatisfiedLinkError
NullPointerException UnsupportedClassVersionError
NumberFormatException VerifyError
RuntimeException VirtualMachineError
SecurityException
StringIndexOutOfBoundsException
UnsupportedOperationException

Packages

import java.lang.System;//importato di default
 
java.applet
java.awt
java.awt.color
java.awt.datatransfer
java.awt.dnd
java.awt.event
java.awt.font
java.awt.geom
java.awt.im
java.awt.image
java.awt.image.renderable
java.awt.print
java.beans
java.beans.beancontext
java.io
java.lang
java.lang.ref
java.lang.reflect
java.math
java.net
java.rmi
java.rmi.activation
java.rmi.dgc
java.rmi.registry
java.rmi.server
java.security
java.security.acl
java.security.cert
java.security.interfaces
java.security.spec
java.sql
java.text
java.util
java.util.jar
java.util.zip
javax.accessibility
javax.swing
javax.swing.border
javax.swing.colorchooser
javax.swing.event
javax.swing.filechooser
javax.swing.plaf
javax.swing.plaf.basic
javax.swing.plaf.metal
javax.swing.plaf.multi
javax.swing.table
javax.swing.text
javax.swing.text.html
javax.swing.text.html.parser
javax.swing.text.rtf
javax.swing.tree
javax.swing.undo
org.omg.CORBA
org.omg.CORBA.DynAnyPackage
org.omg.CORBA.ORBPackage
org.omg.CORBA.portable
org.omg.CORBA.TypeCodePackage
org.omg.CosNaming
org.omg.CosNaming.NamingContextPackage
sun.tools.ttydebug
sunw.io
sunw.util.
com.sun.image.codec.jpeg
com.sun.java.swing.plaf.windows
com.sun.java.swing.plaf.motif

JSON

URL url = new URL("http://freegeoip.net/json/");
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();
 
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //convert the input stream to a json element
JsonObject rootobj = root.getAsJsonObject(); //may be an array, may be an object.
string val = rootobj.get("key").getAsString();
import com.google.gson.Gson;
public class JsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String json = "{ \"foo\": 1, \"bar\": [ \"10\", \"apples\"] }";
        MyJsonObject obj = gson.fromJson(json, MyJsonObject.class);
        System.out.println(obj.getFoo());
        for(String bar : obj.getBar()) {
            System.out.println(bar);
        }
        obj = new MyJsonObject(2, new String[] { "20", "oranges" });
        json = gson.toJson(obj);
        System.out.println(json);
    }
}
class MyJsonObject {
    private int foo;
    private String[] bar;
    public MyJsonObject(int foo, String[] bar) {
        this.foo = foo;
        this.bar = bar;
    }
    public int getFoo() {
        return foo;
    }
    public String[] getBar() {
        return bar;
    }
}

file read

import java.io.BufferedReader;
import java.io.FileReader;
class fileReadTest {
    public static void main(String args[]){
        BufferedReader br = null;
        String line;
        float totalVal = 0;
        try{
            br = new BufferedReader(new FileReader("./file.csv"));
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",");
                String sval = parts[1].replace("\"","").replace("+","");
                totalVal += Float.parseFloat(sval);
            }
        } catch (Exception ex){ System.out.println(ex); }
        System.out.println("Total: " + totalVal);
    }
}
 
public void printSmiles(){
    BufferedReader br = new BufferedReader(new FileReader("pathToFile.txt"));
    String line;
    while((line = br.readline) != null){
        System.out.println(line);
    }
}

STDIN read

package it.ev.test_io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import it.ev.Accounts;
public class Program {
    public static void main(String[] args) throws IOException {
        BufferedReader isr = new BufferedReader(new InputStreamReader(System.in));
        String num = 0;
        {
            System.out.println("inserire un numero di conto valido:");
            num = isr.readLine();
            System.out.println("numero '" + num + "' is" + (Accounts.isValid(acct) ? "" : " non") + " valido.");
        } while (acct != null && acct.length() != 0);
    }
}

file download

import org.apache.commons.io;
try {
    URL url = new URL(driver.getCurrentUrl());
    File file_path = new File("/tmp/myFile.pdf");
    FileUtils.copyURLToFile(url, file_path);
} catch (Exception x) {
    x.printStackTrace();
}

nio

URL website = new URL("http://test/file");
Files.copy(website.openStream(), target, StandardCopyOption.REPLACE_EXISTING);

binary launcher

package main
import (
    "fmt"
    "os/exec"
)
func main() {
    start_java_app_test()
}
func start_java_app_test() {
    cmd_str := "java -Xmx2g -jar test_app.jar"
    cmd_output, err := exec.Command("bash", "-c", cmd_str).CombinedOutput()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(cmd_output)
}