Intellij Idea下的Javafx Maven部署 [英] Javafx maven deployment under Intellij Idea
问题描述
我在Intellij Idea Editor下有一个基于Maven的项目.我正在使用javafx-maven-plugin. 我的目标是将我的项目部署为EXE或MSI可安装文件. 由于这是第一次使用maven,请plz帮助我为pom.xml文件进行正确的配置.还是有除Maven之外的其他简便方法可以帮助我实现自己的目标,所以,请毫不犹豫地提及它.
I have a maven based project under Intellij idea Editor. I'm using javafx-maven-plugin. My goal is to deploy my project as EXE or MSI installable file. Since this the first time using maven, plz help me to make a correct configuration for pom.xml file. Or is there another way easy than maven that can help me acheive my Goal, So, don't hesitate to mention it.
所以,这是我的pom.xml
So, this my pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.abdo.EntrepriseLimted</groupId>
<artifactId>EntrepriseLimited</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>ENTREPRISELIMITED</name>
<url>http://maven.apache.org</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>8.2.0</version>
<configuration>
<mainClass>MainApplication</mainClass>
<verbose>true</verbose>
<vendor>Abdo</vendor>
</configuration>
<executions>
<execution>
<!-- required before build-native -->
<id>create-jfxjar</id>
<phase>package</phase>
<goals>
<goal>build-jar</goal>
</goals>
</execution>
<execution>
<id>create-native</id>
<phase>package</phase>
<goals>
<goal>build-native</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources/fxml</directory>
</resource>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>8.40.10</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1206-jdbc42</version>
</dependency>
<dependency>
<groupId>org.jfxtras</groupId>
<artifactId>jfxtras-labs</artifactId>
<version>8.0-r4</version>
</dependency>
<dependency>
<groupId>org.jfxtras</groupId>
<artifactId>jfxtras-controls</artifactId>
<version>8.0-r4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.16</version>
</dependency>
</dependencies>
</project>
使用com.zenjava:javafx-maven-plugin:jfx-jar执行此pom.xml之后. 我得到了显示此结果的结果:
After executing this pom.xml using com.zenjava:javafx-maven-plugin:jfx-jar. I get this result showing this result :
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ EntrepriseLimited ---
[INFO] Building jar: D:\Projects\6.Project SI limted\2 nd iteration\2. Object Oriented design\target\EntrepriseLimited-1.0.jar
[INFO]
[INFO] <<< javafx-maven-plugin:8.2.0:jar (default-cli) @ EntrepriseLimited <<<
[INFO]
[INFO] --- javafx-maven-plugin:8.2.0:jar (default-cli) @ EntrepriseLimited ---
[INFO] Building JavaFX JAR for application
[INFO] Adding 'deploy' directory to Mojo classpath: D:\Projects\6.Project SI limted\2 nd iteration\2. Object Oriented design/src/main/deploy
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.316s (Wall Clock)
[INFO] Finished at: Tue Mar 01 13:04:24 WAT 2016
[INFO] Final Memory: 25M/226M
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
该项目似乎已成功部署,但: 在目标目录下 双击文件后,我得到文件名"EntrepriseLimited-1.0.jar". 在target/jfx/下我得到EntrepriseLimited-1.0-jfx.jar 在target/jfx/lib下,我看到了相关性.双击文件"ntrepriseLimited-1.0-jfx.jar"后,效果不佳.
It seems that the project was successfully deployed but: under target directory i get a file name "EntrepriseLimited-1.0.jar", after double click the file not works. under target/jfx/ i get EntrepriseLimited-1.0-jfx.jar under target/jfx/lib i see the dependencies. after double clicking the file "ntrepriseLimited-1.0-jfx.jar" it not works as well.
这是主要的应用代码:
public class MainApplication extends Application {
private Stage primaryStage = null;
@Override
public void start(Stage primaryStage) throws Exception {
this.primaryStage = primaryStage;
buildMainWindow();
}
private void buildMainWindow() {
FXMLLoader loader = new FXMLLoader();
Parent parent = new AnchorPane();
System.out.println(getClass().getResource(""));
loader.setLocation(getClass().getResource("fxml/mainWindow.fxml"));
loader.setRoot(parent);
try {
parent = (AnchorPane) loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Scene sc = new Scene(parent);
primaryStage.setScene(sc);
primaryStage.centerOnScreen();
primaryStage.show();
}
public void setPrimaryStage(Stage stage) {
this.primaryStage = stage;
}
public Stage getPrimaryStage() {
return primaryStage;
}
public static void main(String[] args) {
launch(args);
}
}
她是mainWindow的控制器,在其中我根据用户打开新窗口 动作:
And her is the controller for mainWindow where i open new windows, based on user Action:
public class MainWindowController implements Initializable {
// Tabbed pane
@FXML
private TabPane tbTabPaneHome;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
private void createTab(String title, AnchorPane parent) {
Tab tab = new Tab(title);
for (Tab child : tbTabPaneHome.getTabs()) {
if (child.getText().equals(title)) {
tbTabPaneHome.getSelectionModel().select(child);
return;
}
}
tab.setContent(parent);
tbTabPaneHome.getTabs().addAll(tab);
tbTabPaneHome.getSelectionModel().select(tab);
}
private Parent loadContent(URL resources) {
try {
FXMLLoader loader = new FXMLLoader();
Parent parent = new AnchorPane();
loader.setLocation(resources);
parent = loader.load();
return parent;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private AnchorPane buildEntrepriseTab() {
AnchorPane parent = (AnchorPane) loadContent(getClass()
.getResource("../fxml/entreprise/entreprise.fxml"));
return parent;
}
private AnchorPane buildTransactionTab() {
AnchorPane parent = (AnchorPane) loadContent(getClass()
.getResource("../fxml/transaction/transaction.fxml"));
return parent;
}
private AnchorPane buildAccountTab() {
AnchorPane parent = (AnchorPane) loadContent(getClass()
.getResource("../fxml/account/account.fxml"));
return parent;
}
private AnchorPane buildTypeOfTransactionTab() {
AnchorPane parent = (AnchorPane) loadContent(getClass()
.getResource("../fxml/TypeOfTransaction.fxml"));
return parent;
}
private AnchorPane buildUserTab() {
AnchorPane parent = (AnchorPane) loadContent(getClass()
.getResource("../fxml/user/user.fxml"));
return parent;
}
// Event Handling
// Action events
@FXML
public void listDesEntrepriseClicked() {
createTab("Entreprise", buildEntrepriseTab());
}
@FXML
public void listTransactionClicked() {
createTab("Transaction", buildTransactionTab());
}
@FXML
public void listTypeOfTransactionClicked() {
createTab("TypeOfTransaction", buildTypeOfTransactionTab());
}
@FXML
public void listAccountClicked() {
createTab("Compte", buildAccountTab());
}
@FXML
public void listUserClicked() {
createTab("Utilisateur", buildUserTab());
}
}
推荐答案
由于执行jfx:jar
目标,因此获得jar
文件作为输出.
You get jar
file as an output because you execute jfx:jar
goal.
要获取本机软件包,应致电jfx:native
.您可以在target/jfx/native/
下找到您的软件包.
To get native packages you should call jfx:native
. You'll find your packages under target/jfx/native/
.
顺便说一下,有一个不错的Maven配置生成器(插件的版本已过时,但仍然可以使用)这里.它不仅使您能够生成有效的maven插件配置,而且还解释了所有配置属性并告诉您应调用的目标.
By the way, there's nice maven config generator (bit outdated version of plugin, but still works) here. It not only allows you to generate working maven plugin configuration, but also explains all configuration properties and tells you what goal should you call.
这篇关于Intellij Idea下的Javafx Maven部署的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!