java - 从命令行运行模块时如何包含外部 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
提前致谢。
解决方案
推荐阅读
- html - 在 CSS 中制作透明文本并在文本形状内拟合背景图像
- php - woocommerce_add_cart_item_data 过滤器挂钩的第一个参数上的空数组
- boost - pthread_recursive_mutex - 断言失败
- spring-boot - 在客户端应用程序中设置和更新 Keycloak/OpenId-Connect 声明
- pytorch - 了解 TensorboardX 图
- c++ - 从 Boost 1.73+ Asio 中的套接字获取 io_context 引用
- r - 将变量中的数字与字符分开,长度不一致 -R
- r - R:Quantmod 在股票代码前用 ^ 符号拉动标准普尔指数
- elasticsearch - Searchkick / Elasticsearch 聚合的结果不一致
- javascript - 将字符串中的所有指定整数返回到数组中