我有一个简单的Java 9 SE项目,它依赖于一个非模块化的项目(本例中选择了Weld SE),我正在尝试用Maven(clean install
)构建它。为了让Java9发挥作用,我添加了模块信息。java
。最初,该文件只包含模块名称,没有要求的
公式。
请记住,我唯一的依赖项不是一个模块化项目,因此我假设Maven将放入类路径(而不是模块路径),因此它将最终位于模块化系统状态中描述的
未命名模块中。
现在,我的Maven版本是3.3.9,我知道我需要在3.6版本中使用Maven编译器插件,正如这里所描述的,当然我已经下载了JDK 9 EA build with jigsaw,并将Maven设置为使用它。
如果我构建项目时没有
模块信息。java
,一切正常,东西被添加到类路径,构建成功。我想只要你把那个文件删掉,Maven就会坚持老办法。
然而,用
module-info.java
构建它告诉我,在类路径上找不到我依赖项中的类。所以我在调试模式下运行Maven(使用-X),事实上——所有的Jar都在模块路径下,类路径是空的。这实际上意味着我所有的依赖项都被转移到自动模块中,我需要在module-info.java
中声明它们。
一旦我声明了自动模块需求(链接到Project的
模块信息
),我就能够在JDK 9上构建它。但它有点凌乱——我唯一的pom。xml
依赖于weld se core
,但我的模块信息
要求我声明更多编译要求才能通过。
这是一个完整的GitHub项目,可以观察到所有这些。
所以我的问题是:
如果我知道一些工件不是模块化的,我可以告诉Maven把它们放在类路径上吗?这样我就可以避免自动模块
和声明它们的需要?
- 如果我坚持使用
自动模块
,我可以告诉Maven以某种方式瞬态地允许我的依赖项需要引入的任何东西吗?例如,Weld的其他部分,CDI API等。
我需要声明的实际原因是什么,我的项目需要
模块,而我不直接使用这些模块?例如weld.environment.common
如果您指定了模块信息。java
file,您需要声明除java之外的所有java模块。base您现在使用的是拼图,所以需要使用它。
使用mvn dependency:tree
可以帮助您填充此内容,但您不需要使用module info。java 9中的java
。
我认为这可能有助于告诉maven使用java 9:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
包括最近的一些更新,我会尝试回答这个问题。
>
今天的maven编译器插件
的最低兼容版本是3.7.0
。
@Tunaki已经分享了如何配置它,为JDK 1.5到8和JDK 9构建兼容的版本。
假设从问题和评论中可以看出,您已经知道自动模块,并将所有模块依赖项放置在模块路径上。
如果我知道一些工件没有模块化,我能告诉Maven在类路径上放置它们吗?这样我就可以避免自动模块和声明它们的需要?
对于maven pom
如果我坚持使用自动模块,我能告诉Maven以某种方式瞬态地允许我的依赖项需要引入的任何东西吗?例如焊接、CDI应用编程接口等的其他部分。
不,因为自动模块不包含显式声明的
module-info.java
,所以没有这样的方法来定义需要传递性
来满足当前模块可能需要的任何传递性依赖。
根据我过去的经验,模块在编译时需要的任何Maven传递依赖(如
依赖:树
中详细说明的)都必须使用当前项目的modal-info
中的要求
显式定义。
我需要声明我的项目需要模块的实际原因是什么,我不直接使用这些模块?例如weld.environment.common**
>
对于模块在编译或运行时不需要的模块,不需要指定
要求
。
如果项目在运行时不需要依赖项,但在编译时需要依赖项,则需要确保在声明中使用
requires static
定义此类模块。
我现在最好也采用类似的方法,正如我应该保留或删除声明的依赖项(这些依赖项也是传递依赖项)的答案中所述?
问题内容: 我有一个简单的Java 9 SE项目,该项目仅依赖于一个非模块化项目(在本示例中选择Weld SE),并且尝试使用Maven()构建它。为了添加Java 9,我添加了。最初,此文件仅包含模块名称,没有公式。 请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束中描述的模块化系统的状态。 现在,我的Maven版本是3.3.9,并且
我有一个多模块Maven项目,有模块“app”和“域”。应用依赖于域。域模块有公共和私有代码。公共代码在包中。 在Domain模块的pom中,我添加了maven jar插件的执行,该插件使用分类器“api”(仅包含公共类)生成一个额外的项目工件。 在应用程序模块中,我在域模块上添加了一个“运行时”范围的依赖项(因此所有类都存在于运行时),并在分类的“API”上添加了编译时范围的依赖。这是为了确保应
问题内容: 我有一个独立的Java应用程序,我想将其打包为:myapp.jar。并将所有相关的jar文件复制到“备用文件夹”。理想情况下,我想让Maven更新META- INF文件,以将所有类路径依赖项jar条目添加到其中。 例如,如果我的项目引用了commons.jar,并且当我使用此插件构建程序集时,它将所有.class文件和程序包从commons.jar复制到myappjar- with-d
我有一个多模块maven项目,包含三个模块、和 Core具有以下依赖项定义 我已经为所有三个模块添加了Java9定义,的如下所示: 但是,我不知道如何让的测试类能够在测试执行期间看到类。当尝试测试运行时,找不到类。 如果向的添加需要My.Project.TestUtils;的: 然后在编译时,我得到一个错误,即找不到模块(大概是因为它只是作为测试依赖项引入的)。 在Java9模块化的世界中,如何处
我有一个包含多个子项目的根项目。最初,我们将这些项目作为独立的Maven项目保留,但我意识到Gradle更适合我使用。但是对于其中一个子项目,我们宁可不将其转换为Gradle项目,而将其保留为Maven项目。 root/build.gradle root/common.gradle root/api/pom.xml
嗨我在网上搜了一遍,看了一堆文章,所以问题和文档都找不到解决办法,这里是我的问题。 我有一个多模块maven项目,其中包含三个模块a、B和C,a和B独立,C依赖于a和B,当然我有一个父项目。我还设置了一个jenkins服务器来构建这些项目,以及一个nexus存储库。 如有任何帮助,不胜感激。谢谢!