2013-05-27 4 views
6

Ok, ecco cosa abbiamo:Comprese le librerie nel barattolo

Abbiamo due pacchetti di librerie, che abbiamo compilato in barattoli.

 
package starwars; 
public class JarJar { 

    public void JarSayHello() 
    { 
     System.out.println("Jaaaaar!!"); 
    } 

} 

 
package barwars; 
public class BarBar { 

    public void BarSayHello() 
    { 
     System.out.println("Baaaaa!!"); 
    } 

} 

compiliamo questi con

 
javac -d bin -sourcepath src src/barwars/BarBar.java 
jar cvf barwars.jar -C bin . 

e

 
javac -d bin -sourcepath src src/starwars/JarJar.java 
jar cvf starwars.jar -C bin . 

Tutto bene in vasi per noi.

Ora vogliamo includere questi due vasi in un altro progetto java.

Quindi abbiamo

  • /project/src/a_pack/HelloWorld.java
  • /project/libs/starwars.jar
  • /project/libs/barwars.jar
  • /project/manifest.txt
 
package a_pack; 
import starwars.JarJar; 
import barwars.BarBar; 

public class HelloWorld { 

    public static void main(String[] args) {  
     System.out.println("Hello, World");   
     JarJar myJar = new JarJar(); 
     myJar.JarSayHello();   
     BarBar myBar = new BarBar(); 
     myBar.BarSayHello(); 
    } 

} 

Manifest.txt

 
Main-Class: a_pack.HelloWorld 
Class-Path: libs/starwars.jar libs/barwars.jar 

Ora compiliamo questo con:

 
javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java 
jar cvfm helloworld.jar manifest.txt -C bin . 

E questo compila e funziona bene.

Ora ho due problemi.

In primo luogo - se sposto questo file jar da qualche altra parte, e provo eseguirlo, allora vado a prendere:

Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar

Ora posso risolvere il problema spostando la cartella libs ovunque mi muovo il vaso. Ma questo mi sembra un po 'disordinato (e se ci fosse già una cartella libs in quella posizione?).

Idealmente, quello che mi piacerebbe fare è includere i barattoli di riferimento all'interno del barattolo, quindi c'è un barattolo che contiene tutto ciò che è necessario eseguire all'interno di sé.

È possibile? (Ed è una buona pratica?)

+2

Si potrebbe voler esaminare come Maven risolve questo. –

risposta

7

Possibile, sì. Buona pratica, no.

I jar sono solo file zip, quindi è possibile decomprimere e rezip a vostro piacimento. Il problema più grande è la gestione di tutti questi vasi separati man mano che il progetto si ingrandisce.

La maggior parte dei progetti non viene compilata utilizzando la riga di comando. Invece, un IDE mantiene i tuoi vasi aggiornati. Inoltre, i più moderni progetti Java utilizzano Maven o Ivy per posizionare i contenitori in un repository e analizzarli secondo le necessità.

Vedere Eclipse, Netbeans o Intellij per IDE. E guarda in Maven per strutturare il tuo progetto.

+0

Grazie per il tuo post, lo terrò a mente. – dwjohnston

+0

Se possibile, come? Conosco eclipse e altri IDE, ma in questo momento sto provando a creare un singolo file .jar grassetto all'interno di un'immagine docker con dipendenze minime. Dato che c'è 'helloworld.jar' e un gruppo di giare esterne in' libs/', cosa scriverebbe nel terminale per ottenere' helloworldwithdeps.jar'? –

+0

Ancora una volta, struttura il tuo progetto usando Maven, quindi dai un'occhiata al progetto Apache Shade per creare un vaso uber. – ccleve