Intellij Idea下Javafx maven部署
Javafx maven deployment under Intellij Idea
我在 Intellij idea Editor 下有一个基于 maven 的项目。我正在使用 javafx-maven-plugin。
我的目标是将我的项目部署为 EXE 或 MSI 可安装文件。
由于这是第一次使用 maven,请帮助我为 pom.xml 文件进行正确的配置。或者有没有比 maven 更简单的方法可以帮助我实现我的目标,所以,请不要犹豫。
所以,这是我的 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 之后。
我得到这个结果显示这个结果:
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.Project SI limted nd iteration. 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.Project SI limted nd iteration. 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" 效果不佳。
这是主要的应用程序代码:
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);
}
}
她是我打开新 windows 主窗口的控制器,基于用户
操作:
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());
}
}
你得到 jar
文件作为输出,因为你执行了 jfx:jar
目标。
要获取本机包,您应该调用 jfx:native
。您会在 target/jfx/native/
.
下找到您的包裹
顺便说一下,有一个很好的 maven 配置生成器(有点过时的插件版本,但仍然有效)here。它不仅允许您生成工作的 maven 插件配置,而且还解释了所有配置属性并告诉您应该调用什么目标。
我在 Intellij idea Editor 下有一个基于 maven 的项目。我正在使用 javafx-maven-plugin。 我的目标是将我的项目部署为 EXE 或 MSI 可安装文件。 由于这是第一次使用 maven,请帮助我为 pom.xml 文件进行正确的配置。或者有没有比 maven 更简单的方法可以帮助我实现我的目标,所以,请不要犹豫。
所以,这是我的 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 之后。 我得到这个结果显示这个结果:
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.Project SI limted nd iteration. 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.Project SI limted nd iteration. 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" 效果不佳。
这是主要的应用程序代码:
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);
}
}
她是我打开新 windows 主窗口的控制器,基于用户 操作:
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());
}
}
你得到 jar
文件作为输出,因为你执行了 jfx:jar
目标。
要获取本机包,您应该调用 jfx:native
。您会在 target/jfx/native/
.
顺便说一下,有一个很好的 maven 配置生成器(有点过时的插件版本,但仍然有效)here。它不仅允许您生成工作的 maven 插件配置,而且还解释了所有配置属性并告诉您应该调用什么目标。