Domanda

È possibile specificare un classpath Java che include un file JAR contenuto in un altro file JAR?

È stato utile?

Soluzione

Se stai cercando di creare un singolo jar che contenga la tua applicazione e le sue librerie richieste, ci sono due modi (di cui sono a conoscenza) per farlo. Il primo è One-Jar , che utilizza un caricatore di classi speciale per consentire l'annidamento dei vasetti. Il secondo è UberJar , (o Shade ), che esplode le librerie incluse e mette tutte le classi nel vaso di livello superiore.

Vorrei anche ricordare che UberJar e Shade sono plugin rispettivamente per Maven1 e Maven2. Come menzionato di seguito, puoi anche usare il plugin assembly (che in realtà è molto più potente, ma molto più difficile da configurare correttamente).

Altri suggerimenti

NON vuoi usare questi "esplodi contenuti JAR" soluzioni. Rendono sicuramente più difficile vedere le cose (dal momento che tutto è esploso allo stesso livello). Inoltre, potrebbero esserci conflitti di denominazione (non dovrebbe accadere se le persone usano pacchetti adeguati, ma non puoi sempre controllarlo).

La funzione che desideri è una delle 25 principali RFE Sun : RFE 4648386 , che Sun, nella sua infinita saggezza, ha designato come basso priorità. Possiamo solo sperare che Sun si svegli ...

Nel frattempo, la migliore soluzione che ho trovato (che vorrei che Sun copiasse nel JDK) è usare il caricatore di classi personalizzato JarClassLoader .

Dopo alcune ricerche ho trovato un metodo che non richiede maven o alcuna estensione / programma di terze parti.

Puoi utilizzare " Percorso di classe " nel tuo file manifest.

Ad esempio:

Crea file manifest MANIFEST.MF

Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass

Compila tutte le tue classi ed esegui jar cfm Testing.jar MANIFEST.MF * .class custom_lib.jar

c sta per creare archivio f indica che si desidera specificare il file v è per input dettagliato m significa che passeremo un file manifest personalizzato

Assicurati di aver incluso lib nel pacchetto jar. Dovresti essere in grado di eseguire jar in modo normale.

basato su: http://www.ibm.com/developerworks/library/j-5things6/

trovi tutte le altre informazioni di cui hai bisogno sul percorso di classe qui

Utilizza il tag zipgroupfileset (usa gli stessi attributi di un tag fileset ); decomprimerà tutti i file nella directory e li aggiungerà al nuovo file di archivio. Ulteriori informazioni: http://ant.apache.org/manual/Tasks/zip.html

Questo è un modo molto utile per aggirare il problema jar-in-a-jar - lo so perché ho cercato su Google questa esatta domanda StackOverflow mentre cercavo di capire cosa fare. Se vuoi impacchettare un barattolo o una cartella di vasetti nel tuo unico barattolo con Ant, allora dimentica tutto questo percorso di classe o plugin di terze parti, tutto ciò che devi fare è questo (in Ant):

<jar destfile="your.jar" basedir="java/dir">
  ...
  <zipgroupfileset dir="dir/of/jars" />
</jar>

Se stai costruendo con ant (sto usando ant da eclipse), puoi semplicemente aggiungere i file jar extra dicendo alla formica di aggiungerli ... Non è necessariamente il metodo migliore se hai un progetto gestito da più persone, ma funziona per un progetto individuale ed è facile.

per esempio il mio obiettivo che stava costruendo il file .jar era:

<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
    <manifest>
        <attribute name="Author" value="ntg"/>
        ................................
        <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
    </manifest>
</jar>

Ho appena aggiunto una riga per farlo:

<jar ....">
    <zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
    <manifest>
        ................................
    </manifest>
</jar>

dove

<property name="external-lib-dir" 
          value="C:\...\eclipseWorkspace\Filter\external\...\lib" />

era la directory con i vasetti esterni. E questo è tutto ...

Non senza scrivere il proprio caricatore di classi. Puoi aggiungere vasetti al percorso di classe del vaso, ma devono essere collocati contemporaneamente, non contenuti nel vaso principale.

È necessario creare un caricatore di classi personalizzato per fare questo o una libreria di terze parti che supporti questo. La soluzione migliore è estrarre il jar dal runtime e aggiungerli al percorso di classe (o averli già aggiunti al percorso di classe).

Uso maven per le mie build java che ha un plug-in chiamato plug-in dell'assemblaggio maven .

Fa quello che stai chiedendo, ma come alcuni degli altri suggerimenti descrivono - essenzialmente esplodendo tutti i barattoli dipendenti e ricombinandoli in un singolo barattolo

Se disponi di IDE eclpise, devi solo esportare il tuo JAR e scegliere le librerie "Package Required in JAR generate". eclipse aggiungerà automaticamente i JAR dipendenti richiesti nel JAR generato, oltre a generare un caricatore di classi personalizzate eclipse che carica automaticamente questi JAR.

Stavo per consigliarti di estrarre tutti i file allo stesso livello, quindi di estrarre un risultato dal risultato, poiché il sistema di pacchetti dovrebbe tenerli ben separati. Sarebbe il modo manuale, suppongo che gli strumenti indicati da Steve lo faranno bene.

Winstone è abbastanza buono http: / /blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/. Ma non per siti complessi. E questo è un peccato perché tutto ciò che serve è includere il plugin.

Bene, c'è un modo molto semplice se stai usando Eclipse.

Esporta il tuo progetto come " eseguibile " File Jar (fare clic con il pulsante destro del mouse sulla cartella del progetto da Eclipse, selezionare " Esporta ... "). Quando configuri le impostazioni di esportazione, assicurati di selezionare " Estrai le librerie richieste nel Jar generato. & Quot; Ricorda, seleziona " Estrai ... " e non " Librerie richieste dal pacchetto ... " ;.

Inoltre : devi selezionare una configurazione di esecuzione nelle impostazioni di esportazione. Quindi, potresti sempre creare un main () vuoto in qualche classe e usarlo per la tua configurazione di esecuzione.

Ad ogni modo, non è garantito funzionare il 100% delle volte, poiché noterai un messaggio pop-up che ti dice di assicurarti di controllare le licenze dei file Jar che stai incluso e qualcosa sul non copiare i file delle firme. Tuttavia, lo faccio da anni e non ho mai riscontrato problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top