我有一个简单的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 build并设置了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,可以观察到所有这些。
所以我的问题是:
automatic module
并且需要声明它们吗? automatic module
,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何内容吗?例如。 Weld的其他部分,CDI API等。 requires
模块,我不直接使用的实际原因是什么?例如。 GitHub project 的答案 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)
包括最近的一些更新,我会尝试并回答这个问题。
更新
今天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
的答案