JBuilder [ANT] Anfängerfragen zu ANT und der main class

Smokers

Mitglied
Hallo,

ich soll mich mal ein wenig mit ANT beschäftigen und habe bisher folgende build.xml geschrieben.

[XML]<?xml version="1.0" ?>
<project name="PROJEKT" default="help" basedir=".">
<property name="src.dir" value="${basedir}/src"/>
<property name="bin.dir" value="${basedir}/bin"/>
<property name="lib.dir" value="${basedir}/lib"/>

<target name="init" depends="clean">
<mkdir dir="${bin.dir}"/>
</target>
<target name="clean">
<delete dir="${bin.dir}"/>
</target>


<target name="buildGUI" depends="init">
<javac srcdir="${src.dir}" destdir="${bin.dir}">
<classpath>
<fileset dir="${basedir}\lib">
<include name="*.jar"/>
</fileset>
</classpath>
</javac>
<jar destfile="PROJEKTGUI.jar" basedir="${basedir}">
<include name="lib"/>
<manifest>
<attribute name="Built-By" value="Us"/>
<attribute name="Implementation-Vendor" value="SSWTA PROJEKT"/>
<attribute name="Implementation-Title" value="PROJEKT"/>
<attribute name="Implementation-Version" value="0.7 beta"/>
<attribute name="Main-Class" value="de.uriuni.PROJEKT.in.gui.PROJEKTGui"/>
</manifest>
</jar>
</target>
</project>[/XML]


Meine Ordner-Struktur sieht zZ so aus :

Code:
├───bin
│   └───de
│       └───uriuni
│           └───PROJEKT
│               ├───dataStructs
│               │   └───data
│               │           Data.class
│               │           Exam.class
│               │           OptimizedSeatingPlan.class
│               │           Room.class
│               │           RoomResources.class
│               │           RoomStructure.class
│               │           Student.class
│               │           SVG.class
│               │
│               ├───in
│               │   ├───cli
│               │   │       PROJEKTCli.class
│               │   │       PROJEKTCLILoadConfig.class
│               │   │       PROJEKTCliOperandParser.class
│               │   │       PROJEKTCliOptions.class
│               │   │       PROJEKTCliSimpleDate.class
│               │   │
│               │   ├───gui
│               │   │       PROJEKTGui$1.class
│               │   │       PROJEKTGui$10.class
│               │   │       PROJEKTGui$11.class
│               │   │       PROJEKTGui$12.class
│               │   │       PROJEKTGui$13.class
│               │   │       PROJEKTGui$14.class
│               │   │       PROJEKTGui$15.class
│               │   │       PROJEKTGui$16.class
│               │   │       PROJEKTGui$2.class
│               │   │       PROJEKTGui$3.class
│               │   │       PROJEKTGui$4.class
│               │   │       PROJEKTGui$5.class
│               │   │       PROJEKTGui$6.class
│               │   │       PROJEKTGui$7.class
│               │   │       PROJEKTGui$8.class
│               │   │       PROJEKTGui$9.class
│               │   │       PROJEKTGui.class
│               │   │       PROJEKTGuiCalc$1.class
│               │   │       PROJEKTGuiCalc$2.class
│               │   │       PROJEKTGuiCalc$Task.class
│               │   │       PROJEKTGuiCalc.class
│               │   │       PROJEKTGuiDatePicker$PROJEKTDayLabel.class
│               │   │       PROJEKTGuiDatePicker$PROJEKTMonthPanel.class
│               │   │       PROJEKTGuiDatePicker$PROJEKTNavigatePanel.class
│               │   │       PROJEKTGuiDatePicker.class
│               │   │       PROJEKTGuiHelp.class
│               │   │       PROJEKTGuiObserver.class
│               │   │
│               │   └───initial
│               │           ConfigtoCLI.class
│               │           Init.class
│               │           Initialiser.class
│               │           RoomResources.class
│               │
│               ├───optimize
│               │   └───optimizer
│               │           EvoOptimizer.class
│               │           Opti.class
│               │           Optimizer.class
│               │
│               └───out
│                   ├───preparer
│                   │       DemoValueClass.class
│                   │       Prep.class
│                   │       Preparer.class
│                   │       StudentDivider.class
│                   │
│                   └───printers
│                           Pdf.class
│                           Printer.class
│                           Xml.class
│
├───lib
├───resources
│   ├───export
│   ├───images
│   │   └───datepicker
│   ├───locales
│   ├───locations
│   │   ├───svg
│   │   └───xml
│   └───tests
└───src
    └───de
        └───uriuni
            └───PROJEKT
                ├───dataStructs
                │   └───data
                │           Data.java
                │           Exam.java
                │           OptimizedSeatingPlan.java
                │           Room.java
                │           RoomResources.java
                │           RoomStructure.java
                │           Student.java
                │           SVG.java
                │
                ├───in
                │   ├───cli
                │   │       PROJEKTCli.java
                │   │       PROJEKTCLILoadConfig.java
                │   │       PROJEKTCliOperandParser.java
                │   │       PROJEKTCliOptions.java
                │   │       PROJEKTCliSimpleDate.java
                │   │
                │   ├───gui
                │   │       PROJEKTGui.java
                │   │       PROJEKTGuiCalc.java
                │   │       PROJEKTGuiDatePicker.java
                │   │       PROJEKTGuiHelp.java
                │   │       PROJEKTGuiObserver.java
                │   │
                │   └───initial
                │           ConfigtoCLI.java
                │           Init.java
                │           Initialiser.java
                │           RoomResources.java
                │
                ├───optimize
                │   └───optimizer
                │           EvoOptimizer.java
                │           Opti.java
                │           Optimizer.java
                │
                └───out
                    ├───preparer
                    │       DemoValueClass.java
                    │       Prep.java
                    │       Preparer.java
                    │       StudentDivider.java
                    │
                    └───printers
                            Pdf.java
                            Printer.java
                            Xml.java

Im eclipse rufe ich die GUI halt zZ auf indem ich die Klasse PROJEKTGui.java starte.
Wenn ich nun mein BuildFile ausführe, dann bekomme ich halt die Meldung das die main class nicht gefunden wurde ( de.uriuni.PROJEKT.in.gui.PROJEKTGui )

Hat da jemand eine Idee :-/ ?
 
Nunja, erstmal müsste dein JAR Basedir ${bin.dir} sein und zweitens funktioniert es nicht ohne weiteres einfach die ganzen JARs aus lib mit in ein JAR zu packen.
 
mhh okay :-/...warum geht das mit dem einbinden der libs halt nicht so einfach?
das mit dem base dir dank ich dir schonmal werd ich morgen früh wenn ich nen rechner in der hand hab gleich mal versuchen umzusetzen.... danke 🙂
 
Was genau möchtest du mit den jars im lib Verzeichnis machen? Sollen die alle in dein jar reingepackt werden? Oder soll dein jar "nur" auf die anderen jar zugreifen können? Sprich, sie müssten neben deinem jar existieren?

Falls die jars alle in dein jar gepackt werden sollten, so geht das schon. Unter eclipse gibt es im Export Bereich ja eine Option, die man aktivieren kann. Ich habe mir das ganze vor kurzem auch einmal angeschaut, da ich ebenfalls libs zu meinem jar hinzufügen wollte.

Eclipse benutzt dazu einen "jar-in-jar-loader.zip". Ich habe dann versucht, mittels Ant einen Build zu erstellen, der das selbe Ergebnis liefert wie ein Export unter Eclipse mit der Option "include libs in jar file".
Das Ergebnis sieht so aus:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<project name="NameOfMyProject" basedir="." default="main">

<property name="src.dir" value="src"/>

<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>

<property name="main-class" value="com.package.path.to.my.app.projectName"/>

<property name="lib.dir" value="lib"/>

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


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

<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
</target>

<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/myApp.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>
<attribute name="Rsrc-Main-Class" value="com.package.path.to.my.app.projectName"/>
<attribute name="Class-Path" value="."/>
<attribute name="Rsrc-Class-Path" value="./ args4j-2.0.9.jar TestLib-src.jar commons-collections-3.2.1.jar commons-lang-2.3.jar commons-logging-1.1.1.jar cxf-2.2.10.jar jaxb-impl-2.1.13.jar jaxb-xjc-2.1.13.jar mail-1.4.jar saaj-api-1.3.jar saaj-impl-1.3.2.jar velocity-1.6.4.jar wsdl4j-1.6.2.jar wss4j-1.5.8.jar wstx-asl-3.2.9.jar xml-resolver-1.2.jar XmlSchema-1.4.5.jar xmlsec-1.4.3.jar"/>
</manifest>
<zipfileset src="./jar-in-jar-loader.zip"/>
<fileset dir="${lib.dir}" includes="**/*.jar" />
</jar>
</target>

<target name="main" depends="clean,jar"/>

</project>
[/XML]

Der eigentliche Sinn besteht offenbar darin, im jar manifest als Main den jarinjarloader zu benennen. Die eigentliche Programm Main wird dann unter Rsrc-Main-Class definiert. Zusätzlich muss dann noch jedes jar im Rsrc-Class-Path angegeben werden. Könnte auch sein, dass man hier mit *.jar arbeiten kann. So hab ich das irgendwo im Netz gefunden und es hat funktioniert, also hab ich es nicht mehr verändert.

Das ganze wird bestimmt keinen Schönheitswettbewerb gewinnen und ich bin mir nicht mal sicher ob man das zwingend so machen muss oder ob es noch "schöner/eleganter" geht, aber auf diese Weise bekomme ich zumindest mein Programm mit externen libs compiliert und zusammengepackt als ein ausführbares jar.
 
Also ideal Fall wäre die output Struktur:

projekt
│ Libraries.jar
│ ProjektCLI.jar
│ ProjektGUI.jar

└───raeume
raum1.svg
raum2.svg
raum3.svg
raum4.svg


Also die libraries können schon gepackt sein, jedoch in einer extra jar.
vorallem sollen die raeume im extra ordner vorhanden sein, damit auch selber raume hinzugefügt werden können vom benutzer...

wäre das irgendwie machbar?
 

Zurück
Oben