从 Eclipse 启动使用 Maven 配置的 JavaFX 应用程序

Posted

技术标签:

【中文标题】从 Eclipse 启动使用 Maven 配置的 JavaFX 应用程序【英文标题】:Launch JavaFX application configured with Maven from Eclipse 【发布时间】:2019-12-01 05:19:12 【问题描述】:

我有一个可以与 Maven 一起正常运行的 JavaFX 应用程序:

mvn compile
mvn exec:java  # Launches the GUI

这是在 Ubuntu 上,使用 openjdk-11-jdkmavenopenjfx Ubuntu 软件包。

我想从 Eclipse IDE 编译和运行这个应用程序(安装了 sudo snap install --classic eclipse 的 Eclipse)。我安装了 m2e (Maven to Eclipse) 插件,并使用 File -> Import -> Maven -> Existing Maven Project 导入了项目。对于非 JavaFX 项目,m2e 插件可以从 Maven 的 pom.xml 完成在 Eclipse 中配置项目所需的一切。不幸的是,就我而言,缺少一些东西:类型检查正常工作并找到 javafx.* 类,但是当我尝试运行应用程序时,我在控制台中收到以下错误消息:

Error: JavaFX runtime components are missing, and are required to run this application

一种解决方法是将应用程序作为 Maven 应用程序 (Run -> Run As -> Maven Build -> target=exec:java) 运行,但我发现它不太方便且速度较慢,因此我正在寻找一种方法让应用程序在 Eclipse 中直接作为 Java 应用程序运行.

我找到了手动配置 Eclipse 的方法(作为答案发布在下面),但我仍然想知道是否有更好的方法,可以让 Maven + m2e 完全完成这项工作,即尽可能多地从pom.xml 让一切都在 Eclipse 中“正常工作”。

这个问题可以在一个极简的例子上重现,这个pom.xml

<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>jfxpl</groupId>
  <artifactId>jfxpl</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>11.0.2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.2</version>
    <configuration>
      <mainClass>App</mainClass>
    </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>
      <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.5.0</version>
    <configuration>
      <mainClass>App</mainClass>
    </configuration>
      </plugin>
    </plugins>
  </build>
</project>

以及任何使用 JavaFX 的应用程序,例如:

import javafx.application.Application;
import javafx.stage.Stage;

public class App extends Application 

    @Override
    public void start(Stage stage) throws Exception 
        System.out.println("Start!"); // Or real JavaFX stuff here obviously
    

    public static void main(String[] args) 
        Application.launch(args);
    

【问题讨论】:

参见openjfx.io/openjfx-docs/#IDE-Eclipse,Maven 部分 谢谢,这确实有帮助,但并没有完全回答使用 Eclipse + Maven 的意义(以及没有让 m2e 自动配置所有内容的相关挫败感)。 你试过e(fx)clipse插件吗?我将它与 Java 8 一起使用,它为创建新的 JavaFX 项目、运行 JavaFX 应用程序、FXML 支持、CSS 支持等提供了良好的支持。 显示您的pom.xml。是this the same issue?另见this m2e mailing list post。 JavaFX 在 Java 8 之后不受支持 【参考方案1】:

一种解决方案是手动配置Eclipse添加所需模块:Run -&gt; Run configurations -&gt; Java Application -&gt; Arguments -&gt; VM Arguments,添加--module-path /path/to/JavaFX/lib --add-modules=javafx.controls

如果您需要其他模块,请将 then 指定为逗号分隔的列表,例如 --add-modules javafx.controls,javafx.fxml

【讨论】:

【参考方案2】:

由于您有一个 Maven 项目,您可以简单地使用您正在使用的 maven 插件中的目标,并让 Eclipse(通过m2e)为您运行它,但您必须指定这些目标是什么,并且您要运行哪个配置。

假设您有这个HelloFX 示例。

你的 pom 看起来像:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>12</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <mainClass>org.openjfx.hellofx.App</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

请注意,我使用的是javafx-maven-plugin 而不是exec-maven-plugin,但您也可以使用它。前者适当地负责将 JavaFX 模块添加到模块化路径中,而后者根本不使用模块。

如果您在终端上,设置 JDK 12 并运行:

mvn clean javafx:run

将按预期工作。

但是,您希望从 Eclipse 而非终端运行它,因此您可以从 Run -&gt; Run Configurations... -&gt; Maven Build 创建一个新的 Maven 构建配置:

添加clean javafx:run,并确保正确设置了JRE(例如JDK 12)。按应用并关闭对话框。

现在您可以单击工具栏或上下文菜单中的Run as 绿色图标。将显示一个对话框,您只需选择Maven Build 选项:

然后按OK,它将按预期运行您的目标。

如果您没有创建任何运行配置,则在选择 Maven 构建时会要求您创建一个并提供所需的目标。这意味着当您单击运行按钮时,Eclipse 不会从您的 pom 中猜测您要运行哪些可能的目标。

请注意,您也可以按下拉图标,然后打开一个对话框,显示您的自定义配置:

hellofx 将运行指定的目标。

最后,您仍然可以以Java Application 的身份运行您的项目,而没有像 Maven 这样的构建工具的好处,并且您必须添加 VM 参数(这意味着您首先需要下载 JavaFX SDK) ,如您的answer。然后你可以从同一个下拉按钮运行这个其他配置(在我的例子中是hellofx2)。

请注意,所有这些都详细记录在here。

【讨论】:

这就是我所说的“解决方法是将应用程序作为 Maven 应用程序运行”的意思,但是您的答案详细记录了它,这应该对其他读者有所帮助。谢谢! 所以,如果我说得对,您说使用 Maven 从 Eclipse 运行您的 Maven 项目是一种解决方法吗?作为 Java 应用程序,Eclipse 需要知道 VM 参数,因为 JavaFX 需要在模块路径中。作为 Maven 项目,您正在使用为您处理这些问题的插件(即 javafx-maven-plugin 或 exec-maven-plugin),因此您需要做的就是告诉 Eclipse 您想要运行哪些插件和目标)。 【参考方案3】:

OpenJDK for linux 不附带 JAVAFX 框架。您需要下载并安装。

sudo apt-get install openjfx

安装后使用以下步骤:

Set the SDK first

第一步:

GOTO File -> Project Structure -> Modules -> Dependency >> + [on left-side of window] click + sign

第二步:

Run >> Edit Configurations

第三步:在虚拟机配置中添加以下参数:

--module-path /path/to/JavaFX/lib --add-modules=javafx.controls

【讨论】:

谢谢,但我不认为这比我在发布问题时提供的答案更好地回答问题 (***.com/questions/57159440/…)【参考方案4】:

这可能是重复的,你试过了吗

<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>8.8.3</version>
<configuration>
    <mainClass>your.main.class.which.extends.javafx.Application</mainClass>
</configuration>
</plugin>

此处提供:JavaFX Application with Maven in Eclipse

此外,还有一些文档,可能与 Java 11 完全相关。

https://openjfx.io/openjfx-docs/

以下是文档提供的 OpenJFX 版本。

https://gluonhq.com/products/javafx/

还有,

https://openjfx.io/openjfx-docs/images/ide/eclipse/modular/maven/eclipse05.png

是通过 maven 构建的绝佳形象。

【讨论】:

以上是关于从 Eclipse 启动使用 Maven 配置的 JavaFX 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

windows下配置eclipse,开发maven项目

eclipse从git下载的maven项目需要转成maven才可是使用main方法启动

eclipse怎么操作运行配置

[maven]在eclipse中创建maven项目

eclipse关于maven和springboot框架的安装

Eclipse上Maven环境配置使用