当前位置: 首页 > 面试题库 >

我需要使用Maven构建具有非模块化依赖项的JDK 9项目

穆商震
2023-03-14
问题内容

我有一个简单的Java 9 SE项目,该项目仅依赖于一个非模块化项目(在本示例中选择Weld SE),并且尝试使用Maven(clean install)构建它。为了添加Java 9,我添加了module-info.java。最初,此文件仅包含模块名称,没有requires公式。

请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束unnamed module中描述的模块化系统的状态。

现在,我的Maven版本是3.3.9,并且我知道我需要在版本3.6中使用Maven编译器插件,如下所述。当然,我已经下载了带有拼图的JDK 9 EA
bu​​ild,并设置了Maven以使用它。

如果我不使用来构建项目module- info.java,则一切正常,则将所有内容添加到类路径中,并且构建成功。我想只要您不考虑该文件,Maven就会坚持旧方法。

但是, 使用with进行 构建会module- info.java告诉我,我的依赖项中的类无法在classpath上找到。因此,我在调试模式下(带有-X)运行了Maven,实际上-
所有jar都在module-path下,而classpath为empty 。这实际上意味着我所有的依赖项都已 转移到
自动模块中
,我需要在中声明它们module-info.java

声明自动模块要求(链接到项目的module-info)后, 便可以在JDK 9上构建它 。但这有点杂乱-
我唯一的pom.xml依赖就在了weld-se-core,但是我module-info要求我声明 更多的要求 才能通过编译。

这是整个GitHub项目,可以观察到所有这些。

所以我的问题是:

  1. 如果我知道一些构件不是模块化的,我可以告诉Maven将它们放在classpath上吗? 这样我就可以避免automatic module和需要声明它们?
  2. 如果我坚持automatic module,我可以告诉Maven以某种方式可传递地允许我的依赖项需要引入的任何内容吗?例如Weld,CDI API等的其他部分。
  3. 为什么我需要声明requires不直接使用的 项目模块的实际原因是什么 ? 例如weld.environment.common

问题答案:

包括一些最近的更新,我会 尽力 回答。

更新

  • Java 9已于2017年9月21日公开发布。

  • 该最低兼容版本的maven-compiler-plugin在今天的日期3.7.0

@Tunaki已经分享了如何配置它以构建JDK 1.5至8和JDK 9的兼容版本。

从问题和注释中假设,您已经知道自动模块,并将所有模块依赖项放在模块路径上。

如果我知道一些构件不是模块化的,我可以告诉Maven将它们放在classpath上吗?这样我就可以避免自动模块,而无需声明它们?

对于在maven pom中指定的工件<dependencies>以及module-info.java当前模块中未包括的工件,最终都将其留下,以
未命名模块的 形式从类路径中进行访问

如果我坚持使用自动模块,是否可以告诉Maven以某种方式可传递地允许我的依赖项需要引入的任何内容?例如Weld,CDI API等的其他部分。

,因为自动模块不包含显式声明的module-info.java,所以没有这种方法可以定义 _ requires transitive_ 当前模块可能需要的任何传递依赖。

从我的一个过去的经验,如在详细Maven的任何传递依赖dependency:tree的是需要在该模块编译时就必须使用被明确定义requiresmodule-info当前项目中。

为什么我要声明我的项目需要模块而不是直接使用的实际原因是什么?例如,weld.environment.common **

  • 您不需要requires为模块指定在编译或运行时不需要的模块。

  • 如果项目在运行时不需要某个依赖关系,而在编译时需要一个依赖关系,则需要确保 _ requires static_ 在声明中使用定义此类模块。



 类似资料:
  • 我有一个简单的Java 9 SE项目,它依赖于一个非模块化的项目(本例中选择了Weld SE),我正在尝试用Maven()构建它。为了让Java9发挥作用,我添加了。最初,该文件只包含模块名称,没有

  • 问题内容: 我有一个独立的Java应用程序,我想将其打包为:myapp.jar。并将所有相关的jar文件复制到“备用文件夹”。理想情况下,我想让Maven更新META- INF文件,以将所有类路径依赖项jar条目添加到其中。 例如,如果我的项目引用了commons.jar,并且当我使用此插件构建程序集时,它将所有.class文件和程序包从commons.jar复制到myappjar- with-d

  • 我有一个多模块Maven项目,有模块“app”和“域”。应用依赖于域。域模块有公共和私有代码。公共代码在包中。 在Domain模块的pom中,我添加了maven jar插件的执行,该插件使用分类器“api”(仅包含公共类)生成一个额外的项目工件。 在应用程序模块中,我在域模块上添加了一个“运行时”范围的依赖项(因此所有类都存在于运行时),并在分类的“API”上添加了编译时范围的依赖。这是为了确保应

  • 我有一个多模块Maven项目,其中包含子模块ModuleA和ModuleB等。ModuleA将ModuleB列为依赖项。但是,当仅构建模块A时,Maven不会解决模块B的依赖关系-导致。我想避免构建整个父级以使构建更快。目前我发现让它工作的唯一方法是使用exec插件和脚本,将父项目称为“ModuleB, ModuleA”,这意味着我必须在每次依赖项更改时更改脚本(例如添加ModuleC)。 是否有

  • 我想将我的项目打包在一个单独的非可执行库JAR中进行分发。如何使Maven项目将所有依赖项JAR打包到输出JAR中?Maven assembly插件中有一个选项来创建一个具有依赖项的可执行JAR。有一个接收器来获得目标。但是,我需要构建一个没有类的库jar。我怎么才能造出这样的罐子?

  • 我有一个多模块maven项目,包含三个模块、和 Core具有以下依赖项定义 我已经为所有三个模块添加了Java9定义,的如下所示: 但是,我不知道如何让的测试类能够在测试执行期间看到类。当尝试测试运行时,找不到类。 如果向的添加需要My.Project.TestUtils;的: 然后在编译时,我得到一个错误,即找不到模块(大概是因为它只是作为测试依赖项引入的)。 在Java9模块化的世界中,如何处