2013-01-16 8 views
8

Ich habe so viele Artikel/Erklärungen dazu gelesen und zu viele Stunden verbracht, aber alles ist entweder zu breit oder spezifisch.Wie mehrere Gläser zu einem kombinieren?

Diese Frage gilt nur für ein Applet, das ich gemacht habe. Es enthält eine Klasse und benötigt 2 andere Jar-Bibliotheken. Ich habe diese in die Projekte aufgenommen (mehrere Projekte, weil ich dies in Netbeans und Eclipse versucht habe ... es ist einfach ein Einklassenprojekt neu zu erstellen). Der Sinn von all dem ist, dass mein HTML/Web-Projekt nicht mehr als ein Jar verarbeiten oder auf sie verweisen muss. Es ist auch kein kompliziertes Applet/Projekt.

Ursprünglich habe ich es in Netbeans gemacht. Es hat das Hauptpaket und nach dem Hinzufügen der 2 Jars werden sie in einen "Libraries" -Bereich (den "Resources" -Ordner) gelegt. Nach dem Erstellen erstellt Netbeans ein Jar für mein einzelnes Paket/eine Klasse und stellt dann die 2 anderen Bibliotheken in ein "lib" -Verzeichnis daneben. Ich möchte, dass sie in einem verteilbaren Jar sind. Von den vielen Dingen, die ich durchgeschaut habe, habe ich versucht, folgendes in build.xml zu setzen:

Aber es produziert nichts. Ich habe das von NetBeans - deploying all in one jar. Ich weiß nicht, wie man build.xml benutzt, also wäre ich nicht überrascht, wenn etwas (natürlich) schief läuft, aber ich bekomme keine Fehler-/Warnmeldungen.

Wenn ich es in Eclipse gemacht habe, kombiniert es sie effektiv, aber wenn ich das Glas in meinem tatsächlichen Webprojekt verwende, sagt es, dass es die Klassen von den anderen 2 Gläsern nicht finden kann. Ich würde nicht verstehen, wie ich es beheben kann, aber ist es ein Classpath-Problem? In Eclipse mache ich ein neues Verzeichnis namens "lib" und setze die Jars darin. Dann klicke ich mit der rechten Maustaste auf das Projekt, gehe zu "Java Build Path" und füge die Jars hinzu und überprüfe sie auf der Registerkarte "Order and Export". Nach den Dingen, die ich gelesen habe, klicke ich mit der rechten Maustaste auf das Projekt, wähle "Exportieren", wähle "Jar", deaktiviere die ".classpath" und ".project" Dateien, nur "Exportiere generierte Klassendateien und Ressourcen" und dann Erlaube es, die Manifest-Datei zu generieren. Wie ich schon sagte, erzeugt dies ein Jar, aber sein Inhalt ist mein Paket und dann ein "lib" Verzeichnis, das die 2 anderen Jars hat. Das Manifest ist da, aber es ist ziemlich leer und referenziert keine Dateien (nicht sicher, ob das wichtig ist). Wenn ich es in meine Web-App lege, heißt es, dass das Applet die anderen Klassen nicht finden kann.

Es scheint nur so einfach - ein Paket/Klasse, zwei externe Jars ... zu einem Jar kombinieren, wenn für die Verteilung als Applet gebaut. Irgendwelche Ideen?

UPDATE:

Da wir Maven begann, sah jemand in ein Maven Plugin. So landeten wir ein neues Projekt anlegen auf das Applet Hause (da es über mehrere Projekte verwendet wird), und verwenden diese in unseren pom.xml, am Ende:

<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> 

Und es war schön, weil es uns erlaubt, unsere zu nutzen Code Signing Certificate, um es auch automatisch zu signieren.

+1

* "Der Punkt von allem ist, dass mein HTML/Web-Projekt nicht mit mehr als einem Jar umgehen muss" * Es ist trivial, es so zu machen, dass der Browser damit umgehen kann. * "Irgendwelche Ideen?" * Stellen Sie die Jars auf die übliche Weise bereit (das hat Vorteile gegenüber Ihrer aktuellen Strategie) und sparen Sie sich Zeit. –

+0

Es ist besser, Abhängigkeiten von einem Glas zu einem anderen zu machen.Viele Glas machen Werkzeuge macht Ihre Arbeit einfach. –

+0

@joeyrohan Ich bin mir nicht sicher, was du meinst, aber deshalb versuche ich, Netbeans 'und Eclipse's Build-Tools zu verwenden, was ich dazu beitragen würde. – Ian

Antwort

4

Zunächst möchte ich sagen, dass es wirklich keinen Grund gibt, die Gläser zu kombinieren - Sie können ein Applet mit Ihrer Klassendatei (nicht in einem Glas) und seinen separaten abhängigen Gläsern bereitstellen.

Wenn Sie jedoch das Gefühl haben, dass Sie einen großen Krug aus Ihrer Klasse und all ihren Abhängigkeiten machen müssen, dann können Sie das tun.

Sie können JAR-Dateien jedoch nicht in eine andere JAR-Datei einfügen - JAR-Dateien funktionieren nicht auf diese Weise. Was Sie brauchen, ist für alle Inhalte aller JAR-Dateien extrahiert werden, und dann wieder in einem Glas gezippt.

Wenn Sie dies tun, würde ich vorschlagen, das Build-Tool Maven, um es zu tun. Sobald Sie Ihren Build mit Maven eingerichtet haben, können Sie die konfigurieren, um ein großes Glas für Sie zu bauen.

Ich weiß, dass Eclipse Maven unterstützt, und ich nehme an, dass NetBeans auch tut.

+0

Entschuldigung, ich wusste, dass die einfache Kombination von Jars nicht funktionieren würde, je nachdem, welche Gründe Sie angegeben haben. Also ich denke, mein Punkt war, hoffentlich ein einfaches Beispiel von Code/Arbeit/Logik zu bekommen, das erklärt, wie man das erreicht, was ich in einem Szenario deiner Wahl erreichen will - Eclipse, Netbeans, Maven, was auch immer. Wie du vorgeschlagen hast, Maven zu benutzen, wusste ich nicht, ob du dafür ein paar Schritte machen könntest. Ich schaue mir den zweiten Link an (da ich Maven installiert habe und es in einem anderen Projekt verwende, obwohl ich nicht derjenige bin, der es verwaltet). So danke :) – Ian

-1

Von der Basis des bin-Verzeichnisses, warum nicht versuchen:

jar.exe -cvf cxapplet.jar * 

Platz externe JAR-Dateien in der entsprechenden Stelle in SieFormal bin Verzeichnis und manuell Klassendateien mit den externen JAR-Dateien jar.

Alternativ können Sie unter this thread weitere Informationen finden.

+0

"warum nicht versuchen" - weil ich didn Denk nicht daran. Es ist mir nie in den Sinn gekommen, und ich wusste nicht, wie man das Jar-Tool effektiv benutzt, oder denke, es auf dem Müll zu benutzen. Das einzige, was im 'bin' -Verzeichnis ist, ist der kompilierte Code meiner Hauptklasse (über sein Paket). Wie würde ich also die Dinge in das' lib'-Verzeichnis (neben 'bin') aufnehmen, das sind die zwei externen Jars und extrahiere/kombiniere sie mit dem Inhalt des Verzeichnisses 'bin'. – Ian

+0

(Ich mache das aus dem Gedächtnis von etwas, das ich vor etwa 4 Monaten ausprobiert habe). Kopieren Sie einfach Ihr lib-Verzeichnis in Ihr Build-Verzeichnis, nachdem Sie das Projekt erstellt haben. Siehe auch meine editierte Antwort. – AerusDar

+0

Herrgott, ich weiß nicht, warum ich nicht daran gedacht habe. Wenn ich es also ausprobiere, kombiniert es sie, aber es fügt einfach die zwei externen Jars in die Wurzel des neuen Jars ein ... aber es scheint, dass ich wirklich alles aus den externen Jars extrahieren muss und sie dann alle zippen muss wieder zusammen. Ist das sinnvoll? Netbeans führt genau das aus, was Sie angegeben haben, außer dass Sie sie dem Klassenpfad in der Manifestdatei hinzugefügt haben, damit sie erkennbar sind (oder wie auch immer das funktioniert). – Ian