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

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

岳正阳
2023-03-14

我有一个简单的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项目,可以观察到所有这些。

所以我的问题是:

  1. 如果我知道一些工件不是模块化的,我可以告诉Maven把它们放在类路径上吗?这样我就可以避免自动模块和声明它们的需要?
  2. 如果我坚持使用自动模块,我可以告诉Maven以某种方式瞬态地允许我的依赖项需要引入的任何东西吗?例如,Weld的其他部分,CDI API等。
  3. 我需要声明的实际原因是什么,我的项目需要模块,而我不直接使用这些模块?例如weld.environment.common

共有3个答案

龚永新
2023-03-14
匿名用户

如果您指定了模块信息。javafile,您需要声明除java之外的所有java模块。base您现在使用的是拼图,所以需要使用它。

使用mvn dependency:tree可以帮助您填充此内容,但您不需要使用module info。java 9中的java

闾丘文昌
2023-03-14

我认为这可能有助于告诉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>
易成双
2023-03-14

包括最近的一些更新,我会尝试回答这个问题。

>

今天的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存储库。 如有任何帮助,不胜感激。谢谢!