# JavaFx - Als exe aufrufen



## Hesk (12. Feb 2014)

Hallo!

Ich hab ein JavaFx-Projekt in Eclipse und würde dieses gern so exportieren, dass nur eine .exe-Datei entsteht. Aber kein wo etwas installiert wird, sondern wo das Programm direkt aufgerufen wird.

Die Seite
Deploying JavaFX Applications: Self-Contained Application Packaging | JavaFX 2 Tutorials and Documentation
hab ich mir schon angesehen, nur da ist es nur für netbeans beschrieben.

Kann mir da jemand weiter helfen?


----------



## dzim (12. Feb 2014)

Was da steht, bleibt schon noch weiterhin gültig. Was du brauchst, ist ein build.xml für Ant (wenn du e(fx)clipse nutzt, erstellt das eine build.fxbuild-Datei, die nach ausführen wiederum eine build.xml im Unterordner build erstellt - sorry für das häufige Wort "build", aber so ist es leider...). Dort im Haupttask (bei mir unter "do-deploy") gibt es den Sub-Task <fx:deploy>. Dort kannst du nun das Attribut "nativeBundles" definieren. Verwende dort statt "none" einfach "all" und es sollte gehen. Wenn ich übrigens gesagt habe, er soll nur eine Windows-Exe machen, ging es auch nicht.

Dazu findest du hier mehr: Deploying JavaFX Applications: JavaFX Ant Task Reference | JavaFX 2 Tutorials and Documentation


----------



## Hesk (13. Feb 2014)

Ich verwende kein e(fx)clipse.

Kannst du ein Bsp posten für ein build.xml mitdem ich ein .exe erstellen kann?

Danke!


----------



## dzim (16. Feb 2014)

eigentlich spielt e(fx)clipse keine Rolle. Ich habe dadurch nur eine build.xml erzeugt bekommen. Danach aber derartig stark angepasst, dass ich den Teil des e(fx)clipse-Plugins nicht mehr brauche. Der Link, den ich dir geschickt hab, enthält eigentlich schon alles. Im wesentlichen ist folgendes wichtig: Beim Ant-Build musst du dass javafx-Ant JAR file einbinden - das muss da im JDK liegen, wo auch die jfxrt.jar ist. Dadurch erhälst du dann Zugriff auf die Ant-Tasks, die JavaFX zur Verfügung stellt. Wichtig ist dann, dass du <fx:deploy> in deinen deploy-Task (wie immer der auch bei dir heisst) drin hast und dann die Attribute, wie im Link beschrieben, hinzufügst. Weiter kann ich dir (jedenfalls jetzt im Moment) nicht helfen. Wenn ich Zeit hab, schau ich mal, was ich da so aus efxclipse heraus generieren kann, dann schick ich dir eine Beispiel-build.xml (die du dann anpassen darfst, nach eigenem Gutdünken). Aber wie gesagt: Nur wenn ich die Zeit dafür finde.


----------



## dzim (17. Feb 2014)

Hier die build.xml meines Test-Projekts. Achtung: Es geht davon aus, dass es im Unterordner "build" liegt (wegen der relativen Pfade, die im build.xml stehen - das macht halt das e(fx)clipse-Plugin so).

BTW: Ich würde dir dennoch vorschlagen, das e(fx)clipse-Plugin zu installieren, weil es dir dann für JavaFX-Projekte du nicht noch gross irgendetwas konfigurieren musst... Aber das ist deine Sache.

[XML]
<?xml version="1.0" encoding="UTF-8"?>
	<project name="JFXTest" default="do-deploy" basedir="."  xmlns:fx="javafx:com.sun.javafx.tools.ant">
	<target name="init-fx-tasks">
		<path id="fxant">
			<filelist>
				<file name="${java.home}\..\lib\ant-javafx.jar"/>
				<file name="${java.home}\lib\jfxrt.jar"/>
			</filelist>
		</path>

		<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
			uri="javafx:com.sun.javafx.tools.ant"
			classpathref="fxant"/>
	</target>
	<target name="setup-staging-area">
		<delete dir="externalLibs" />
		<delete dir="project" />
		<delete dir="projectRefs" />

		<mkdir dir="externalLibs" />

		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="simple-xml-2.7.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="commons-logging-1.1.3.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="httpmime-4.3.1.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="log4j-1.2.17.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="httpcore-4.3.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="httpclient-cache-4.3.1.jar"/>	
			</fileset>
		</copy>
		<copy todir="externalLibs">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest\libs">
				<filename name="httpclient-4.3.1.jar"/>	
			</fileset>
		</copy>

		<mkdir dir="project" />
		<copy todir="project">
			<fileset dir="C:\Eclipse\workspace-4.3-2\JFXTest">
				<include name="src/**" />
			</fileset>
		</copy>

		<mkdir dir="projectRefs" />
	</target>
	<target name='do-compile'>
		<delete dir="build" />
		<mkdir dir="build/src" />
		<mkdir dir="build/libs" />
		<mkdir dir="build/classes" />

		<!-- Copy project-libs references -->
		<copy todir="build/libs">
			<fileset dir="externalLibs">
				<include name="commons-logging-1.1.3.jar"/>
				<include name="httpcore-4.3.jar"/>
				<include name="simple-xml-2.7.jar"/>
				<include name="httpclient-cache-4.3.1.jar"/>
				<include name="log4j-1.2.17.jar"/>
				<include name="httpclient-4.3.1.jar"/>
				<include name="httpmime-4.3.1.jar"/>
			</fileset>
		</copy>

		<!-- Copy project references -->

		<!-- Copy project sources itself -->
		<copy todir="build/src">
			<fileset dir="project/src">
				<include name="**/*"/>
			</fileset>
		</copy>

		<javac includeantruntime="false" source="1.7" target="1.7" srcdir="build/src" destdir="build/classes" encoding="Cp1252">
			<classpath>
				<fileset dir="build/libs">
					<include name="*"/>
				</fileset>
				<filelist>
					<file name="C:\Program Files\Java\jdk1.7.0_45\jre\lib\jfxrt.jar"/>
				</filelist>
			</classpath>
		</javac>

		<!-- Copy over none Java-Files -->
		<copy todir="build/classes">
		<fileset dir="project/src">
			<exclude name="**/*.java"/>
		</fileset>
		</copy>


	</target>
	<target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
		<delete file="dist"/>
		<delete file="deploy" />

		<mkdir dir="dist" />
		<mkdir dir="dist/libs" />

		<copy todir="dist/libs">
			<fileset dir="externalLibs">
				<include name="*" />
			</fileset>
		</copy>


		<fx:resources id="appRes">
			<fx:fileset dir="dist" includes="JFXTest.jar"/>
			<fx:fileset dir="dist" includes="libs/*"/>
		</fx:resources> 

		<fx:application id="fxApplication"
			name="JFXTest"
			mainClass="jfxtest.Main"
			toolkit="fx"
		/>

		<mkdir dir="build/classes/META-INF" />



		<fx:jar destfile="dist/JFXTest.jar">
			<fx:application refid="fxApplication"/>
			<fileset dir="build/classes">
			</fileset>
			<fx:resources refid="appRes"/>

			<manifest>
				<attribute name="Implementation-Vendor" value="test"/>
				<attribute name="Implementation-Title" value="JFXTest"/>
				<attribute name="Implementation-Version" value="0.0.1"/>
				<attribute name="JavaFX-Feature-Proxy" value="None"/>
			</manifest>
		</fx:jar>


		<mkdir dir="deploy" />
		<!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
		<fx:deploy
			embedJNLP="false"
			extension="false"
			includeDT="false"
			offlineAllowed="true"
			outdir="${basedir}/deploy"
			outfile="JFXTest" nativeBundles="all"
			updatemode="background" >

			<fx:info title="JFXTest" vendor="test"/>
			<fx:application refId="fxApplication"/>
			<fx:resources refid="appRes"/>
		</fx:deploy>


	</target>
</project>
[/XML]


----------

