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

时间:2016-11-08 15:19:22

标签: java maven java-9 jigsaw

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

请记住,我唯一的依赖项不是模块化项目,因此我假设Maven将放入类路径(而不是模块路径),因此它将以unnamed module结尾,如{{1}中所述3}}

现在,我的Maven版本是3.3.9,我知道我需要在版本3.6中使用Maven编译器插件,因为State of the modular system当然我已经使用jigsaw下载了JDK 9 EA bu​​ild并设置了Maven使用这一点。

如果我在没有module-info.java的情况下构建我的项目,一切正常,将东西添加到类路径并构建成功。我想只要你遗漏那个档案,Maven就会坚持旧的方式。

但是使用 module-info.java构建它告诉我,在类路径中找不到依赖项中的类。所以我在调试模式下运行Maven(使用-X),确实 - 所有jar都在module-path下,classpath为空。这实际上意味着我的所有依赖项都转移到described here ,我需要在module-info.java中声明它们。

我宣布automatic modules(指向项目module-info的链接)后,我可以在JDK 9上构建。但它有点混乱 - 我唯一的pom.xml依赖是weld-se-core,但我module-info要求我声明更多要求以便编译通过。

这是一个完整的automatic module requirements,可以观察到所有这些。

所以我的问题是:

  1. 如果我知道它们没有模块化,我可以告诉Maven在类路径上放置一些工件吗?这样我可以避免automatic module并且需要声明它们吗?
  2. 如果我坚持使用automatic module,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何内容吗?例如。 Weld的其他部分,CDI API等。
  3. 我需要说明我的项目requires模块,我不直接使用的实际原因是什么?例如。 GitHub project

3 个答案:

答案 0 :(得分:1)

我认为这可能有助于告诉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>

答案 1 :(得分:0)

如果指定module-info.java文件,则需要声明除了java.base之外的所有java模块,因为您现在正在使用拼图。

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

答案 2 :(得分:0)

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

  

更新

  • Java 9于2017年9月21日公开发布。
  • 今天maven-compiler-plugin的{​​{3}} 3.7.0<dependencies>

    正如@Tunaki已经分享了如何配置它以构建minimum compatible version的兼容版本。

假设从问题和评论中,您已经知道JDK 1.5 to 8 and JDK 9并将所有模块依赖项放在模块路径上。

  
    

如果我知道它们没有模块化,我可以告诉Maven在类路径上放置一些工件吗?这样我就可以避免使用自动模块并需要声明它们了吗?

  

对于maven pom module-info.java中指定的工件,以及当前模块的module-info.java中未包含的工件最终会被遗留下来,以类路径的形式从< EM> automatic modules

  
    

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

  

,因为自动模块不是由明确声明的dependency:tree组成,所以没有这样的方法来定义 unnamed module. 表示当前模块可能需要的任何传递依赖项。

从我的requires transitive之一,模块在编译时需要的requires中详述的任何Maven传递依赖都必须使用module-info中的requires进行显式定义。当前项目的{1}}。

  
    

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

  
  • 您不需要为模块在编译或运行时不需要的模块指定for($i = 1; $i <= 12; $i++) { $i = str_pad($i, 2, 0, STR_PAD_LEFT); if ($i == $_POST["month"]) { echo "<option value='$i' selected>$i</option>"; } else { echo "<option value='$i'>$i</option>"; } }

  • 如果在运行时需要依赖项但在项目编译时需要依赖项,则需要确保使用 past experiences定义此类模块 在您的声明中。

    我最好也会采用类似的方法,如requires static的答案

  • 所述