首页 > 解决方案 > 从命令行运行模块时如何包含外部 jar 文件

问题描述

问候

我有一个 JavaFX 项目,它依赖于我在 Windows 10 上使用 Netbeans 12.0、JDK 14.0 开发的 JAXB API。由于 JAXB API 从 Java SE 迁移到 JEE,它们驻留在 Netbeans 中的外部 javaee-api-6.0 jar文件中安装目录。我已经设法在 IDE 中编译和运行该项目,但是,我为该项目创建了一个 jar,并且我正在尝试从 Windows 命令提示符(在 IDE 之外)运行它。我利用这个宝贵的资源开始了(https://stackoverflow.com/questions/55652036/how-to-start-javafx-11-application-outside-ide/55653652#55653652),但是,我的情况略有不同。
这是我的模块信息:

module org.openjfx.mavenfxedittableview {
    requires javafx.controls;
    requires javafx.fxml;
    requires java.base;
    requires java.prefs;
    requires transitive java.xml.bind;
   
    opens org.openjfx.mavenfxedittableview to java.xml.bind, javafx.fxml;
    exports org.openjfx.mavenfxedittableview;
    
}


这是 pom.xml 中与 JAXB 相关的依赖项:

   <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.1</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>


我已将 Netbeans 中的 javaee-api-6.0.jar 复制到 C:\MyLibs 目录中,并创建了一个包含在系统类路径中的系统环境变量:

JAVA_EXT=C:\MyLibs


我用指向主类的 META-INF/MANIFEST.MF 来影响项目:

Main-Class: org.openjfx.mavenfxedittableview.TableEditApp


这是我的主类中引入 JAXB (java.ml.bind) 的 import 语句:

import javax.xml.bind.JAXBContext;


这是我的 jar 文件的内容:

0 Tue Sep 08 07:34:02 IRDT 2020 META-INF/
   125 Tue Sep 08 07:34:02 IRDT 2020 META-INF/MANIFEST.MF
  2502 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/addressBookData.xml
  9562 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/Address_Book.png
   859 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/birthdaystatistic.fxml
  2602 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/BirthdaystatisticController.class
  3224 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/DarkTheme.css
  1824 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/DateUtil.class
   967 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/LocalDateAdapter.class
  2962 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/Person.class
  4535 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/personeditdialog.fxml
  4566 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/PersoneditdialogController.class
   839 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/PersonListWrapper.class
  6412 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/personoverview.fxml
  1904 Sat Sep 05 15:19:46 IRDT 2020 org/openjfx/mavenfxedittableview/rootlayout.fxml
  3741 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/RootlayoutController.class
  7433 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/TableEditApp.class
  5966 Sun Sep 06 18:34:38 IRDT 2020 org/openjfx/mavenfxedittableview/TableVieweditController.class
   349 Tue Sep 08 07:34:04 IRDT 2020 module-info.class


这是我用来运行模块的 jar 文件的 java 命令:

java -p "%JAVAFX_HOME%\lib;%JAVA_EXT%;org\openjfx\mavenfxedittableview" -m org.openjfx.mavenfxedittableview


这是系统错误响应:

C:\Users\hrh74\Downloads\Lib\table>java -p "C:\Program Files\java\jFX\javafx-sdk-14.0.2.1\lib;c:\MyLib\;org\openjfx\mavenfxedittableview" -m org.openjfx.mavenfxedittableview
Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found, required by org.openjfx.mavenfxedittableview

任何想法,如何在从命令行运行模块时包含外部 jar 文件,以便可以找到它?

更新1:

我已运行以下命令来找出javaee-api-6.0.jar 文件的模块名称。
jar --file=javaee-api-6.0.jar --describe-module | more

jar 文件的模块名称是 javee.api,正如评论中的 slaw 准确预测的那样。

No module descriptor found. Derived automatic module.

javaee.api@6.0 automatic

我用这个模块名称更新了我的模块信息文件,但是,Netbeans IDE 警告它找不到这个模块,认为实际的 javaee-jar-6.0.jar 在 Netbeans 内部库和项目类路径的一部分中。 在此处输入图像描述

尽管有警告,但项目编译但在运行时(在 IDE 中而不是命令提示符中,这是我的目标)它在尝试使用 JAXB APIS 时显示错误。如果我在 module-info 的“opens”语句中用 java.xml.bind 取代 javaee.api,那么一切都在 IDE 中运行(而不是命令提示符)。

如果,我不对模块信息文件进行任何修改,只是尝试使用 javaee-api-6.0.jar 文件的模块名称 javaee.api 从命令行运行应用程序 jar 文件:

java -p "C:\Program Files\java\jFX\javafx-sdk-14.0.2.1\lib;c:\MyLib" --add-modules javafx.controls,javaee.api -jar org\openjfx\mavenfxedittableview\mavenfxedittableview.jar

然后我收到以下回复:

Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Modules javaee.api and java.xml export package javax.xml.stream.util to module javafx.swt


提前致谢。

标签: javajavafxjaxb

解决方案


推荐阅读