2009-08-01 2 views
21

Ich bin dabei, meine Java-Anwendung in eine JAR-Datei zu packen. Ich benutze Ameise und Sonnenfinsternis. Ich muss tatsächlich ein paar separate, Nicht-Code-Dateien (XML- und TXT-Dateien) direkt unter dem Stammordner in den Jar einfügen, nicht an der gleichen Stelle wie der Code.Hinzufügen von Nicht-Code-Ressourcen zu JAR-Datei mit Ant

Ich versuche includesfile zu verwenden, aber das scheint nicht, hier zu arbeiten, ist mein Ziel ant:

<target name="distribute" depends="compile" includesfile="readthis.txt"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
     <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/>   
    </jar> 
</target> 

Die oben funktioniert gut, wenn ich das includesfile Argument weglassen. Außerdem muss ich mehrere Nicht-Code-Dateien hinzufügen. Diese Dateien befinden sich direkt unter dem Stammprojektordner in Eclipse und nicht innerhalb von Java-Paketen.

Auch, wie Sie oben sehen können, schließe ich im Grunde auch den Quellcode ein. Gibt es eine Möglichkeit, der JAR-Task mitzuteilen, den Quellcode in einen separaten Ordner vom kompilierten Code zu stellen?

Als Kompilier- oder Build-Task kann Ant den Quellcode leicht von den kompilierten Klassen trennen. Aber gibt es eine Möglichkeit, dies auch innerhalb einer JAR-Datei zu tun?

Vielen Dank für Ihre Zeit!

Antwort

34

Sie sollen nicht haben ein includesfile Attribut in einem Ziel mit zu beginnen, und ich vermute, dass Sie den Punkt den es sowieso falsch verstanden habe - die Idee ist, dass die Datei, die Sie mit includesfile angeben enthält Muster für welche Dateien Include, wenn Sie sie nicht in Ihre Ant-Datei einfügen möchten.

Es scheint mir, dass Sie nur ein zusätzliches Dateiset benötigen, das die benötigten Dateien enthält. Zum Beispiel für readthis.txt:

<target name="distribute" depends="compile"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
    <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/> 
    <fileset file="readthis.txt" /> 
    </jar> 
</target> 

Ich würde auch vorschlagen, dass Sie ein neues Verzeichnis für die Ressourcen erstellen, so können Sie dies tun:

<target name="distribute" depends="compile"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
    <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/> 
    <fileset dir="${resourcesDir}" /> 
    </jar> 
</target> 

ohne Ärger. Dadurch wird auch die Struktur Ihres Verzeichnisses sauberer und Sie können Objekte von oben nach unten leichter finden.

+0

Danke! Das hat sicherlich geholfen. Ich habe mich gefragt, ob ich der JAR-Aufgabe auch sagen kann, die Quelle von den kompilierten Klassen zu trennen? Zu diesem Zeitpunkt befinden sich sowohl die Quelle als auch die Klassen in der gleichen Paketstruktur. Sollte die jar-Task die Ausgabe- und src-Ordner nicht beibehalten? Was bedeutet, dass, wenn ich das Glas erweitern, ich sehe in meinejar/code/my/Paket/file.java und file.class Ich dachte, dass das Glas Aufgabe die Ordner wie bewahren kann: meinejar/code/my/Paket /source/file.java - und separat myjar/code/mein/package/build/file.class Fehle ich etwas in meiner Verwendung der Jar-Aufgabe? – denchr

+0

Nein, Sie sind falsch. Sie sollten Seite an Seite stehen. Wenn das JAR eine Ordnerstruktur wie code/my/package/build/file.class enthält, müsste der Paketname code.my.package.build lauten. Sie können die Quellen auch einfach in eine zweite JAR-Datei einfügen. –

+0

Ich sehe was du meinst. Etwas wie das, was ich vorschlage, hätte Auswirkungen auf die Paketbenennung ... Wenn ich also die Quelle in meine JAR-Datei einschließen möchte, muss sie sich im selben Ordner befinden wie der kompilierte Build. – denchr