从命令行运行模块时如何包含外部jar文件

时间:2020-09-08 05:49:28

标签: java javafx jaxb

问候

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

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>


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

JAVA_EXT=C:\MyLibs


我用指向主要类的META-INF / MANIFEST.MF破坏了该项目:

Main-Class: org.openjfx.mavenfxedittableview.TableEditApp


这是我的主类中的import语句,它提取JAXB(java.ml.bind):

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

我已使用该模块名称更新了我的module-info文件,但是,我以为实际的javaee-jar-6.0.jar在Netbeans内部库中并且是项目的一部分,因此Netbeans IDE警告它找不到该模块。类路径。 enter image description here

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

如果我不对module-info文件进行任何修改,只需尝试使用javaee-api-6.0.jar文件的模块名称javaee.api从命令行运行应用程序jar文件:< / p>

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


谢谢。

0 个答案:

没有答案