2013-01-16 12 views
8

Ho letto così tanti articoli/spiegazioni su questo e ho impiegato troppe ore, ma tutto è troppo ampio o specifico.Come combinare più jar in uno?

Questa domanda si applica solo a un'applet che ho creato. Contiene una classe e richiede altre 2 librerie Jar. Ho incluso questi nei progetti (più progetti, perché ho provato questo in Netbeans ed Eclipse ... è facile ricreare un progetto di una classe). Il punto di tutto questo è che il mio progetto HTML/web non dovrebbe avere a che fare con più di un Jar o farvi riferimento. Non è nemmeno un'applet/progetto complicato.

Originariamente, l'ho creato in Netbeans. Ha il pacchetto principale, e dopo aver aggiunto i 2 Jars, vengono messi in un'area "Librerie" (la cartella "risorse"). Dopo averlo creato, Netbeans crea un Jar per il mio unico pacchetto/classe e quindi mette le altre 2 librerie in una directory "lib" accanto ad essa. Mi piacerebbe che fossero in uno, Jar distribuibile. Dalle molte cose che ho esaminato, ho provato a inserire quanto segue in build.xml:

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="dist/BigJar.jar"> 
    <zipfileset src="dist/cxapplet.jar"/> 
    <zipfileset src="resources/dpotapi.jar"/> 
    <zipfileset src="resources/dpotjni.jar"/> 
    </jar> 
</target> 

Ma non produce nulla. Ho ottenuto questo da NetBeans - deploying all in one jar. Non so/capisco come usare build.xml, quindi non sarei sorpreso se qualcosa andasse storto (ovviamente), ma non ricevo messaggi di errore/avviso.

Quando l'ho fatto in Eclipse, li combina efficacemente, ma quando uso il Jar nel mio vero progetto web, dice che non riesce a trovare le classi dagli altri 2 Jars. Non capirei come risolverlo, ma è un problema di Classpath? In Eclipse, creo una nuova directory chiamata "lib" e inserisco i jar. Quindi, faccio clic con il pulsante destro del mouse sul progetto, apro "Percorso di creazione Java" e aggiungo i jar, controllandoli anche nella scheda "Ordine ed esportazione". Dalle cose che ho letto, faccio clic con il pulsante destro del mouse sul progetto, scegli "Esporta", scegli "Jar", deseleziona i file ".classpath" e ".project", seleziona solo "Esporta file e risorse di classe generati", quindi permettigli di generare il file manifest. Come ho detto, questo genera un Jar, ma il suo contenuto è il mio pacchetto e quindi una directory "lib" che ha gli altri 2 Jars. The Manifest è lì, ma è abbastanza vuoto e non fa riferimento a nessun file (non è sicuro se sia importante). Quando lo inserisco nella mia app web, dice che l'applet non riesce a trovare le altre classi.

Sembra così semplice: un pacchetto/classe, due jar esterni ... si combinano in un unico Jar quando vengono creati per la distribuzione come applet. Qualche idea?

UPDATE:

Da quando abbiamo iniziato con Maven, qualcuno sembrava ad utilizzare un plugin Maven. Così abbiamo finito per creare un nuovo progetto per ospitare l'applet (dal momento che è utilizzato su più progetti), e usato questo nel nostro pom.xml, alla fine:

<build> 
    <resources> 
    <resource> 
     <directory>${basedir}/applet</directory> 
     <excludes> 
     <exclude>codesignstore</exclude> 
     </excludes> 
    </resource> 
    <resource> 
     <directory>${basedir}/src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    </resources> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>cxapplet</finalName> 
     <archive> 
      <index>true</index> 
      <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      </manifest> 
     </archive> 
     <appendAssemblyId>false</appendAssemblyId> 
     </configuration> 
     <executions> 
     <execution> 
      <id>make-my-applet-jar</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jarsigner-plugin</artifactId> 
     <version>1.2</version> 
     <executions> 
     <execution> 
      <id>sign</id> 
      <goals> 
      <goal>sign</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <keystore>${basedir}/applet/codesignstore</keystore> 
     <alias>codesigncert</alias> 
     <storepass>HIDDEN</storepass> 
     <keypass>HIDDEN</keypass> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

ed è stato bello perché ci ha permesso di utilizzare il nostro Certificato di firma del codice per firmarlo automaticamente anche.

+1

* "Il punto di tutto questo è che il mio progetto HTML/web non dovrebbe avere a che fare con più di un Jar" * È banale farlo in modo che il browser possa gestirlo. * "Qualche idea?" * Distribuisci i barattoli come al solito (con vantaggi rispetto alla tua strategia attuale) e risparmia tempo. –

+0

È meglio creare dipendenze da un contenitore all'altro. Molti strumenti per la creazione di barattoli facilitano il lavoro. –

+0

@joeyrohan Non sono sicuro di cosa intendi, ma è per questo che sto cercando di utilizzare gli strumenti di costruzione di Netbeans ed Eclipse, che pensavo lo avrebbero fatto, per realizzare questo. – Ian

risposta

4

Prima di tutto, lasciatemi dire che non c'è davvero alcun motivo per combinare i vasi: è possibile distribuire un'applet utilizzando il file di classe (non in un barattolo) e i suoi giare dipendenti separati.

Tuttavia, se ritieni di dover fare un grande vaso fuori dalla tua classe e tutte le sue dipendenze, allora puoi farlo.

Non è possibile inserire file jar in un altro file jar, tuttavia i file jar non funzionano in questo modo. Ciò di cui hai bisogno è che tutti i contenuti di tutti i file jar vengano estratti e quindi compressi nuovamente in un unico contenitore.

Se si intende eseguire questa operazione, suggerirei di utilizzare lo strumento di creazione Maven per farlo. Dopo aver configurato la build con Maven, è possibile configurare lo Maven Assembly Plugin per creare un vaso grande per te.

So che Eclipse supporta Maven e presumo che anche NetBeans funzioni.

+0

Scusa, sapevo che la semplice combinazione di Jars non avrebbe funzionato, per le ragioni che hai fornito. Quindi immagino che il mio punto fosse sperare di ottenere un semplice esempio di codice/lavoro/logica che spieghi come realizzare ciò che voglio in uno scenario a tua scelta: Eclipse, Netbeans, Maven, qualsiasi cosa. Quindi, come hai suggerito di usare Maven, non sapevo se potresti fornire alcuni passaggi per farlo. Vedrò il secondo link (visto che ho installato Maven e lo sto usando in un progetto diverso, anche se non sono io a gestirlo). Quindi grazie :) – Ian

-1

Dalla base della directory bin, perché non provare:

jar.exe -cvf cxapplet.jar * 

Posizionare i file jar esterni nella posizione appropriata in voi la vostra directory bin, e manualmente jar file di classe con i file jar esterni.

In alternativa, vedere this thread che potrebbe fornire ulteriori informazioni per l'utente.

+0

"perché non provare" - perché non ho ci penso :) Non mi è mai passato per la mente, e non sapevo come usare lo strumento jar in modo efficace, o pensare di usarlo sul cestino. Inoltre, l'unica cosa nella directory 'bin' è il codice compilato dalla mia classe principale (tramite il suo pacchetto), quindi come dovrei includere le cose nella directory' lib' (vicino a 'bin'), che sono i due giare esterni ed estrarre/combinarli con i contenuti della directory 'bin'? – Ian

+0

(Sto facendo questo a memoria di qualcosa che ho provato circa 4 mesi fa). Basta copiare la tua dir di lib nella directory di costruzione dopo aver costruito il progetto. Inoltre, vedi la mia risposta editata. – AerusDar

+0

Cribbio, non so perché non ho pensato di farlo. Così, quando l'ho provato, li combina, ma mette semplicemente i due jar esterni nella radice del nuovo Jar ... ma sembra che quello di cui ho veramente bisogno sia estrarre tutto dai giare esterni e poi comprarli tutti di nuovo insieme. Ha senso? Netbeans sta effettivamente facendo la stessa cosa di quello che hai fornito, tranne che li ha anche aggiunti al classpath nel file manifest in modo che siano riconoscibili (o comunque che funzioni). – Ian

Problemi correlati