Src Ordner in jar

Hallo

Ich habe gerade ein jar file mit Ant gemacht und es läuft eigentlich, aber im jar file ist der src Ordner leider nicht vorhanden.

Ich habe folgende Struktur bei meinem Projekt:

ProjectName/src/org/nexLevel/nextLevel/Main.java

Ich habe zudem noch folgende Datei

ProjectName/config/settings.properties

Wenn ich nun mit Ant das jar erstelle, dann fällt der src Ordner weg, d.h. ich habe dann nur noch org/nextLevel… etc. Das ist ein Problem, da ich in der main Klasse auf die config/settings.properties verweise und die dann nicht mehr gefunden wird.

Wie kann ich den src Ordner wieder hinzaubern?

Hier ist mein ant Skript:

[xml]<?xml version="1.0" encoding="UTF-8" standalone="no"?>







<path id="project-classpath">
    <fileset dir="${lib.dir}" includes="*.jar" />
</path>

<target name="remove release">
    <delete dir="${dist.dir}" />
</target>

<target name="clean build">
    <delete dir="${build.dir}" />
</target>

<target name="clean docs">
    <delete dir="${docs.dir}" />
</target>

<target name="compile" depends="clean build">
    <mkdir dir="${build.dir}" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" debug="on" target="1.8" source="1.8">
        <classpath refid="project-classpath" />
        <compilerarg value="-Xlint:none" />
    </javac>
</target>

<target name="docs" depends="clean docs, compile">
    <mkdir dir="${docs.dir}" />
    <javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">
        <fileset dir="${src.dir}">
            <include name="**" />
        </fileset>
    </javadoc>
</target>

<target name="build jar" depends="remove release, compile">
    <mkdir dir="${dist.dir}" />
    <jar destfile="${dist.dir}/myApp.jar">
        <manifest>
            <attribute name="Main-Class" value="org.nextLevel.nextLevel.Main" />
            <attribute name="Class-Path" value="." />
        </manifest>

        <fileset dir="${build.dir}" />
        <zipfileset dir="config" prefix="config" />
        <zipfileset excludes="META-INF/**" src="lib/postgresql-9.3-1102.jdbc41.jar" />
    </jar>
    <antcall target="clean build" />
</target>

<target name="complete build" depends="docs, build jar, clean build" />

[/xml]

du must beim Erzeugen des Jars noch das fileset mit den sources mitgeben.

Iwie sowas wie <fileset dir="${src.dir}" includes="**/*.java"/>

Vielen Dank, das hat aber leider nicht funktioniert. Wenn ich aber verwende, wird der src Ordner erzeugt und hat auch alle notwendigen Unterordner. Das Problem ist aber, dass dann der /org Ordner immer noch nebenbei existiert. D.h. ich habe jetzt die Ordner src/org/… und org/…

Wie kriege ich diesen org Ordner noch weg?

vergiss den src-Ordner, den brauchst du nicht

den config-Ordner, den brauchst du: und den hast du ja in deinem jar (wegen dem )

Der Fehler liegt in deinem Java Code, wie nimmst du auf die Property-Datei Bezug.

Das mache ich durch

input = new FileInputStream(config/settings.properties);

Mit dem FileInputStream liest du (wie der Name schon sagt) aus einer Datei. In Deiner Entwicklungsumgebung funktioniert das, hier liegen alle Dateien in den entspr. Verzeichnissen. In dem jar funktioniert das nicht. Hier gibt es die Datei ja nicht. Innerhalb eines jars kannst Du auf Resourcen zugreifen, als lägen sie in Packages. Mache in etwa folgendes:

InputStream settingsIn = getClass().getResourceAsStream("/config/settings.properties");

Hier noch etwas zum lesen: http://www.javaworld.com/article/2077352/java-se/smartly-load-your-properties.html

Vielen Dank. Ich habs jetzt folgendermassen probiert:

InputStream input = Server.class.getResourceAsStream("/config/settings.properties");
Properties prop = System.getProperties();
prop.load(input);

Ich habe Server.class genommen, da es in der main Methode liegt und daher statisch ist.

Jetzt kriege ich aber eine null pointer exception bei pro.load(input), d.h. das File wurde nicht gefunden. Und das passiert wenn ich es in Eclipse laufen lasse und auch als jar.

Edit: Also die main methode liegt in ProjectName/src/org/nextLevel/nextLevel/Server/Main. Die main methode ruft das properties file auf, welches in ProjectName/config/settings.properties ist.

im jar bitte ohne / am Anfang probieren

InputStream input = Server.class.getResourceAsStream("config/settings.properties");

edit: Quatsch, sollte doch passen mit dem “/” als absoluten Pfad.

Öffne mal das jar mit als zip-Datei (einfach umbennenen in .zip und öffenen) - ist da wirklich der Ordner config drin?

Hmm ich kriege noch den gleichen null pointer exception. :frowning: Ich habe es aber mit Eclipse probiert zu starten (run as…). Ich möchte es aber eben, dass es in Eclipse und als Jar läuft.

Edit: Im jar geht es auch nicht.

NullPointerException kommt, weil “getResourceAsStream()” null zurück gibt, wenn es die Resource unter dem angegebenen Namen nicht findet.
[ul]
[li]Lösung für Eclipse: Füge unter Project Properties -> Java Build Path den Pfad “config…” den Source Folders hinzu.[/li][li]Lösungsmöglichkeit für das jar: Wie schon geschrieben, kontrolliere den Inhalt des jars (kann mit jedem zip-Programm geöffnet werden). Existiert dort der config-Eintrag inkl. Untereinträgen parallel zu den Packages mit den Java-Klassen?[/li][/ul]

Vielen Dank, in Eclipse funktioniert es jetzt. Bin beim config folder auf Build path und habe ihn hinzugefügt. Dann habe ich im Code

InputStream input = Server.class.getClassLoader().getResourceAsStream("settings.properties");

gemacht.

Beim jar funktioniert es immer noch nicht. Ich habe das Jar mit 7zip geöffnet. Es existieren alle Ordner, auch der config/settings.properties.

Muss ich beim build.xml eventuell auch etwas zum build path hinzufügen wie bei Eclipse?

Edit: Wenn ich das settings.properties file beim jar aus dem config Ordner nehme, dann funktioniert es. Warum? Ich hätte es lieber auch im jar im config Ordner.

Wenn Du in Eclipse direkt den config-Folder als Src-Path Konfigurierst, dann befindet sich die properties-Datei im Package-Baum im root (sog. Default-Package). Deswegen funktioniert es in Eclipse mit dem angegebenen Code. Im Jar dann auch nur, wenn Du die properties-Datei aus config rausnimmst. Du brauchst ein “Package” config. D.h. du musst in Eclipse einen übergeordneten Folder als Src-Folder konfigurieren. Dann ist das config-Verzeichnis für Eclipse ein Package.

Ok alles klar.

Wenn ich die properties Datei im jar nun aus config rausnehme, funktioniert es ja auf meinem PC. Aber das wird auch auf anderen PCs funktionieren, oder? Oder ist das jetzt von meinen Einstellungen in Eclipse abhängig?