【问题标题】:Javafx maven deployment under Intellij IdeaIntellij Idea下Javafx maven部署
【发布时间】:2016-06-13 20:29:55
【问题描述】:

我在 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\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”后,它也不能正常工作。

这是主要的应用程序代码:

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 的控制器,基于用户 行动:

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());
    }


}

【问题讨论】:

  • 通常我只创建exe,如果在jfx/native/{project-name}-${project-verions}下的目标中找到
  • 如何配置pom.xml

标签: maven intellij-idea javafx pom.xml


【解决方案1】:

您得到jar 文件作为输出,因为您执行jfx:jar 目标。

要获取本机包,您应该调用jfx:native。您可以在target/jfx/native/ 下找到您的包裹。

顺便说一句,有一个不错的 maven 配置生成器(插件版本有点过时,但仍然有效)here。它不仅允许您生成有效的 maven 插件配置,还解释了所有配置属性并告诉您应该调用什么目标。

【讨论】:

  • 在执行build-native之后,它完美地生成了一个可执行文件,但只有mainWindow可以工作。我仍然无法使其他窗口工作,我认为他没有包含资源文件。无论如何,我已经用更新的 pom.xml 文件更新了我的帖子
  • @abdouamer 请同时添加您实例化新窗口的代码片段。值得检查这些fxml 文件是否存在于您的jar 文件中(通过jfx:jar 生成)
  • 是的,当我打开 JAR 文件时,我看到了我放置 fxml 文件的 fxml 文件夹。
  • @abdouamer 我认为这个讨论正在慢慢成为另一个 SO 问题的好话题。我的项目结构看起来像this,我可以通过简单地 getClass().getResource("/fxml/nameOfMyResource") 获取任何资源。
  • 是的,它确实有效,我的问题是“/”,我使用的是 fxml/ 而不是 /fxml/ ,所以谢谢
猜你喜欢
  • 2013-01-06
  • 2017-07-12
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多