【发布时间】:2019-10-30 18:16:51
【问题描述】:
鉴于在 Eclipse 中从原型 maven-archetype-quickstart 创建的 Maven 项目(junit 升级到 5.5.2,它支持 JPMS),如何将它模块化为 JPMS 项目并且仍然在 Eclipse 中表现良好?
当我尝试这个时,我首先在java 文件夹中创建了模块文件夹,并将包结构移入其中。项目结构如下所示:
jpms(项目文件夹)-> src/main/java/org.myorg.mymodule/org/myorg/myproject/jpmspackage
。到目前为止,一切都很好。该项目在控制台中使用mvn clean install 构建并执行单元测试。然后将模块文件夹(包含 module-info.java 文件 + 包)设置为源文件夹(在 Eclipse 中“用作源文件夹”)。
现在在 Eclipse 中执行 Maven 构建失败并显示
不能在 'jpms/src/main/java' 中嵌套'jpms/src/main/java/org.myorg.mymodule'。启用嵌套从 'jpms/src/main/java' 中排除 'org.myorg.mymodule/'
如何设置源文件夹或构建路径以安抚Eclipse?
模块描述符:
module org.myorg.mymodule {
requires org.junit.jupiter.api;
}
更新了 JUnit 依赖项(该项目最初是使用 JUnit 3-something 生成的)
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
</dependency>
版本:Eclipse 2019-09、Java 12、Maven 3.6.2
【问题讨论】:
-
不要改变项目结构,只需将
module-info.java文件添加到默认包中(例如,右键单击项目文件夹并选择配置>创建module-info.java我>)。请注意,对于每个模块,都需要一个单独的项目,因为在一个项目中拥有多个模块(具有不同的依赖项)是没有意义的(如果需要,请改用嵌套项目)。 -
这可以满足上述问题,但是可以在没有单独的模块文件夹的情况下使用
javac <magic arguments> --module org.myorg.mymodule编译模块吗?例如,上面的示例使用javac -d target/classes/ --module-source-path src/main/java/ --module-path libs/ --module org.myorg.mymodule编译(如果我作弊并将所需的罐子放入库中)。如果没有模块文件夹,javac 似乎找不到模块。 -
第一层的源和输出文件夹以及更深层次的模块文件夹的项目结构与多年的最佳实践相矛盾(模块化就是封装)。更好地使用具有最佳实践项目结构的示例,例如like this one(我猜它也可以在 Eclipse 中使用,无需修改)。
-
如果您回答您的第一条评论,我会将其标记为已接受,因为它解决了上述问题(添加文件夹不是先决条件,我只是假设它是必需的)。
标签: java eclipse maven java-module