当前位置: 首页 > 知识库问答 >
问题:

Java模块和JAR MANIFEST类路径属性

李云
2023-03-14

我有一个Java 8应用程序,我正在将其转换为Java 11,当然,我第一次使用这个模块系统。

我设置了应用程序Maven程序集配置,以便将所有JAR文件放在bin发行版的 /lib目录中。然后,maven-jar-plugin使用所有JAR文件名设置MANIFEST Class-Path值。应用程序使用简单的java-jar /lib/application.jar运行

转到Java11,如果我继续以这种方式构建bin分发,我很想知道运行时如何解释MANIFEST类路径值?我通读了JAR规范(https://docs.oracle.com/en/java/javase/11/docs/specs/jar/jar.html),我想我理解为:

  1. 任何模块化JAR文件(包含module info.class)都将被视为非模块化JAR
  2. 任何非模块化JAR文件(无模块信息类)都将被视为非模块化JAR
  3. 由于所有内容都在类路径上,因此所有内容本质上都是一个未命名的模块
  4. 由于所有内容都在类路径上,因此在运行时基本上没有使用模块系统
  5. 由于所有内容都在类路径上,因此应用程序在本质上应该像Java 8一样运行

如果我真的想改变这一点,我会开始将任何模块化JAR文件放在--模块路径上,并将其他JAR文件保留在类路径上吗?

共有1个答案

李成礼
2023-03-14

确切地通过-jar运行所有代码都在未命名的模块中,而JDK类本身在模块上运行,这就是为什么在使用JDK 9运行的stacktraces中可以看到“java.base/”。

因此,您的调用必须从java-jar lib/application.jar更改为java--mode-path lib--modeApplication/your.main.class

您可以通过使用JLink和/或JPackage进一步改进它,在这里您可以创建一个已经执行您的模块的可执行文件,如/银行标识代码/应用程序。

首先,将所有JAR添加到模块路径中,看看Java是否没有提到拆分包。因此,通过这样做,几乎可以肯定您的模块将是“自动模块”。因此,您可能会遇到一些ClassNotFoundException。

如果发生这种情况,您将需要--add-模块模块

 类似资料:
  • 我似乎找不到任何关于在运行时扫描所有可用类(用于接口、注释等)是否仍然可行的信息,就像Spring、Reflections和许多其他框架和库当前所做的那样,面对与Jigsaw相关的类加载方式的更改。 编辑:这个问题是关于扫描实际的物理文件路径以查找类。另一个问题是动态加载类和资源。这是相关的,但不是重复的。 最新消息:Jetty项目已就此提出了一项标准化API的JEP提案。如果你有办法帮助实现这一

  • 问题内容: 我意识到,当我对node.js模块(带有-g标志)进行全局安装时,除非编写了整个路径,否则无法使用该模块。 我的意思是,如果模块已全局安装,则无法使用: 我必须写: 我如何对节点说必须在正确的路径中寻找模块? 谢谢。 问题答案: 总的来说,我建议让npm为您提供路径并按照上面的说明进行设置:

  • 问题内容: 面对Jigsaw的相关更改,我似乎找不到任何信息,以了解是否仍然可以在运行时扫描所有可用的类(用于接口,批注等),就像Spring,Reflections和当前其他许多框架和库那样。类的加载方式。 编辑 :此问题是关于 扫描 实际的物理文件路径以查找类。另一个问题是关于动态 加载 类和资源。它是相关的,但 绝不是重复的 。 更新 :Jetty项目已经为此制定了标准化API的 JEP提案

  • 我安装了Apache Tomcat来使用servlet。我设置了很少的系统变量。 Catalina_home C:\ruby200\bin;C:\program files\java\jdk1.7.0_09\bin;C:\users\home\appdata\roaming\npm

  • 我对Java 9模块应该具有的假设行为有点困惑。在O'Reilly的Java 9模块化中,我阅读了以下语句: 模块无法读取类路径,因此我们的模块无法访问类路径上的类型,如图8-1所示。 ... 未命名模块导出类路径上的所有代码,并读取所有其他模块。然而,有一个很大的限制:未命名的模块本身只能从自动模块中读取! 但是,在尝试解决Eclipse上的问题(maven依赖项位于类路径而不是模块路径)时,我

  • 我有一个小项目,当我让它运行时,它确实会引发异常。 问题就在这里(TestObject.java): 我真的不明白为什么这会引发异常。我还创建了一个类似于charm的测试(TestTest.java)。请原谅我的名字,但这只是一个小的测试应用程序,可以让它与java 11一起工作。 我遵循了这个:javax。xml。绑定在模块路径或类路径上未找到JAXB-API的JAXBException实现,已