Jump to content


Foto

Eine JavaFX2 Anwendung mit Maven bauen


No replies to this topic

#1 Thomas

Thomas

    Member

  • Adminstrator
  • PIPPIP
  • 86 Beiträge:

Geschrieben 06 Juni 2012 - 22:32

Vor einiger Zeit hatte ich mal wieder eine fixe Idee und diese resultierte darin, dass ich dafür eine Desktop-Applikation brauche. Danach begann ich die verschiedenen Technologieoptionen genauer zu betrachten und zur Auswahl standen:
  • Native Mac OS Anwendung in Objective-C
  • Cross-Platform App mit Qt
  • Cross-Platform App mit Java (Swing)
  • Cross-Platform App mit RCP Framework (Netbeans Platform 7, Eclipse RCP)
  • Cross-Platform App mit Java FX 2
Die Entscheidungsfindung verlief dann ungefähr so.

Native OSX Anwendung:
Die Anwendungen sehe ja chic aus und für mich würde es reichen. Allerdings habe ich vor, mein kleines Tool als Open Source Projekt der Allgemeinheit zur Verfügung zu stellen und ich kann mir vorstellen, das Benutzer anderer Betriebssysteme dafür ebenso Verwendung haben, wie ich auf dem Apple.

Qt:
Mit Qt und C habe ich sehr wenig Erfahrung und so müsste ich sowohl Sprache als auch Framework lernen. Das ist für ein Freizeitprojekt dann vielleicht doch etwas zu aufwendig.

Swing:
Swing würde reichen, da es nach aktueller Planung eine Single-Window-Anwendung wird. Allerdings habe ich auch nicht so viel Erfahrung beim Stylen von Swing Komponenten, so dass diese auch hübsch aussehen.

Java RCP:
Egal ob Netbeans Platform oder Eclipse RCP. Ich hätte ich mich in neue, recht komplexe Frameworks einarbeiten müssen. Außerdem ist so eine umgangreiche Platform vermutlich etwas zu "groß" für meine kleine Anwendung.

Java FX 2:
Nachdem ich Demos gesehen hatte und das der potentielle Nachfolger für Swing werden soll und die UI-Komponenten via CSS gestlyt werden können, habe ich mich damit genauer beschäftigt. Da mittlerweile auch das JDK7u4 für OS X erschienen ist, bei dem Java FX 2.1 inkludiert ist, kann ich damit nun auch arbeiten. Außerdem finde ich es nicht schlecht, mit der Technologie zu diesem frühen Zeitpunkt Erfahrungen zu sammeln und außerdem sieht die Ensemble-Beispielanwendung ähnlich cool aus wie native Mac Apps.

Die Entscheidung ist also auf Java FX 2 gefallen. Das Dependency Management und das Bauen inkl. Testen würde ich gerne von Maven erledigen lassen. Allerdings baut der Application Stub aus Netbeans die Anwendung mit Ant. Also habe ich Zeit und Mühe investiert, um das Bauen mit Maven hinzubekommen. Das hat natürlich auf Anhieb nicht funktioniert, aber nach einiger Zeit mit Google, StackOverflow und verschiedenen Blogs, habe ich eine Lösung gefunden.

Um das überhaupt auszuprobieren habe ich einfach den Applikation Stub, den Netbeans generiert genommen und die Hauptklasse in die Struktur eines Maven-Projektes gesteckt. Mittlerweile bin ich soweit, dass die Anwendung gebaut ist und ich sie sowohl über die Kommandozeile als auch per Doppelclick auf die gebaute Jar-Datei starten kann. "Run" in Netbeans funktioniert bei der Lösung leider nicht.

Dafür musste ich zunächst die settings.xml für Maven erweitern und wie man sieht stehen da noch fix die Pfade zum JDK7 unter OS X drinnen:
<profile>
	<id>javafx</id>
	<activation>
		<activeByDefault>true</activeByDefault>
	</activation>
	<properties>
		<fx.home>/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib/jfxrt.jar</fx.home>
		<fx.ant>/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/lib/ant-javafx.jar</fx.ant>
	</properties>
</profile>
Danach musste die pom.xml angepasst werden mit der Dependency
<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>javafx-runtime</artifactId>
  <version>2.1</version>
  <scope>system</scope>
  <systemPath>${fx.home}</systemPath>
</dependency>
den Properties
<javafx.runtime.lib.jar>${fx.home}</javafx.runtime.lib.jar>
<javafx.tools.ant.jar>${fx.ant}</javafx.tools.ant.jar>
und dem Build-Block:
<build>
	<plugins>
		<plugin>
			<artifactId>maven-enforcer-plugin</artifactId>
			<version>1.0.1</version>
			<executions>
				<execution>
					<id>enforce-maven</id>
					<goals>
						<goal>enforce</goal>
					</goals>
					<configuration>
						<rules>
							<requireMavenVersion>
								<version>3.0.3</version>
							</requireMavenVersion>
							<requireJavaVersion>
								<version>1.7</version>
							</requireJavaVersion>
			<!--requireProperty>
			  <property>env.JAVAFX_HOME</property>
			  <message>You must set the environment variable JAVAFX_HOME to the installation directory of the JavaFX 2.0 SDK!</message>
			</requireProperty -->
						</rules>
					</configuration>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.3.2</version>
			<configuration>
				<source>${maven.compiler.source}</source>
				<target>${maven.compiler.target}</target>
				<showDeprecation>true</showDeprecation>
			</configuration>
		</plugin>
		<plugin>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>2.9</version>
			<configuration>
				<includes>
					<include>**/*Test.class</include>
				</includes>
			</configuration>
		</plugin>
		<plugin>
			<artifactId>maven-antrun-plugin</artifactId>
			<version>1.6</version>
			<executions>
				<execution>
					<id>create-launcher-jar</id>
					<phase>package</phase>
					<goals>
						<goal>run</goal>
					</goals>
					<configuration>
						<target xmlns:fx="javafx:com.sun.javafx.tools.ant">
							<taskdef
								uri="javafx:com.sun.javafx.tools.ant"
								resource="com/sun/javafx/tools/ant/antlib.xml"
								classpath="${javafx.tools.ant.jar}"/>
							<fx:application id="fxApp"
							name="${project.name}"
							mainClass="${exec.mainClass}"/>
							<fx:jar destfile="${project.build.directory}/${project.build.finalName}-launcher">
								<fx:application refid="fxApp"/>
								<fx:fileset dir="${project.build.directory}/classes"/>
							</fx:jar>
							<attachartifact file="${project.build.directory}/${project.build.finalName}-launcher.jar"
							classifier="launcher"/>
						</target>
					</configuration>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<artifactId>maven-assembly-plugin</artifactId>
			<version>2.2.1</version>
			<executions>
				<execution>
					<id>make-assembly</id>
					<phase>package</phase>
					<goals>
						<goal>single</goal>
					</goals>
				</execution>
			</executions>
			<configuration>
				<descriptors>
					<descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor>
				</descriptors>
				<archive>
					<manifestEntries>
						<JavaFX-Version>2.1</JavaFX-Version>
						<JavaFX-Application-Class>${exec.mainClass}</JavaFX-Application-Class>
						<Main-Class>com/javafx/main/Main</Main-Class>
					</manifestEntries>
				</archive>
			</configuration>
		</plugin>
	</plugins>
</build>
Zusätzlich musste ich noch die jar-with-dependencies.xml anlegen:
<?xml version="1.0" encoding="UTF-8"?>

<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>jar-with-dependencies</id>
  <formats>
	<format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
	<dependencySet>
	  <outputDirectory>/</outputDirectory>
	  <unpack>true</unpack>
	  <scope>runtime</scope>
	  <useProjectArtifact>false</useProjectArtifact>
	  <useProjectAttachments>true</useProjectAttachments>
	</dependencySet>
  </dependencySets>
</assembly>

Ich bin jetzt kein Maven-Experte und vielleicht geht das auch einfacher, aber zumindest wird mit diesem Setup ein Jar gebaut, das dann auch ausführbar ist. Vielleicht geht es auch einfacher und vielleicht kann man sich auch irgendwie die jar-with-dependencies.xml sparen und da bin ich natürlich für jeden Tipp dankbar. Außerdem kann ich mir vorstellen, dass es in Kürze auch Archetypen bzw. Plugins für Maven geben wird, die das alles etwas komfortabler machen werden.

Nachdem diese Einstiegshürden und Umgebungsprobleme gelöst sind, kann ich nun endlich anfangen, überhaupt an dem Programm an sich zu arbeiten. Auf dem Weg zu der App werde ich bestimmt noch über einige Dinge stolpern, zu denen es sich lohnen wird, ein eigenes Thema aufzumachen.



Antworten



  


0 Besucher lesen dieses Thema

0 members, 0 guests, 0 anonymous users