【发布时间】:2011-06-12 11:08:03
【问题描述】:
现在我通常会在网络上找到一个 pom.xml 文件,该文件具有 pom 包装,然后将其复制并粘贴以创建我的父项目。然后我曾经在父目录中运行archetype:create 来创建子模块,但从那时起archetype:create 已被弃用。
关于如何创建新的 Maven 多模块项目有什么建议吗?
【问题讨论】:
现在我通常会在网络上找到一个 pom.xml 文件,该文件具有 pom 包装,然后将其复制并粘贴以创建我的父项目。然后我曾经在父目录中运行archetype:create 来创建子模块,但从那时起archetype:create 已被弃用。
关于如何创建新的 Maven 多模块项目有什么建议吗?
【问题讨论】:
我发现最简单的方法是使用 pom-root 原型创建顶级 pom,然后重复使用 archetype:generate 单独创建每个模块。这将自动将模块添加到根 pom(聚合器)并将根 pom 设置为每个模块的父 pom(编辑:显然某些原型可以有一个硬编码的父级,但它适用于maven-archetype-quickstart)。
以下是细分:
创建顶级根:
mvn archetype:generate \
-DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=pom-root \
-DarchetypeVersion=RELEASE
cd 进入您新创建的根目录。
对于每个模块:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE
请注意,上面的-DarchetypeVersion=RELEASE 将自动使用最新版本的原型。您可能需要在每个命令中添加-DgroupId=... 以避免重复。
【讨论】:
这是一个关于如何使用 Intellij Idea 实现此目的的截屏视频。首先,启动一个新项目(File -> New Project),选择'Maven Module':
输入名称,点击下一步,后续步骤不要更改任何内容,点击完成。
现在在您的 pom.xml 中输入 <packaging> 并启用自动更新:
输入模块:
将光标放在m1 并按Alt+Enter。
模块m1 将自动添加到您的项目中。现在您可以对m2 执行 Alt+Enter 了,就是这样。
您也可以首先为项目的现有模块添加pom.xml:在项目树中右键单击它,“添加框架支持...”,选择“Maven”。这将创建一个pom.xml。
【讨论】:
<module>m1</module> 包装在 <modules> 标记内。我是 pom 文件的新手,最后花了很多时间来解释为什么 alt + enter 没有显示任何提到的选项。
mvn archetype:create 已被mvn archetype:generate 弃用,所以只是名称发生了变化。官方存储库中有一个多模块项目的原型,因此运行此命令会产生(极简主义)结果:
[axe@gromp test]$ mvn archetype:generate
..
<num>: remote -> pom-root (Root project archetype for creating multi module projects)
..
Choose a number: 109: <num>
..
[axe@gromp test]$ tree
.
└── modules.test
└── pom.xml
1 directory, 1 file
[axe@gromp test]$ cat modules.test/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>modules.test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>modules.test</name>
</project>
所以,基本上你必须自己创建文件夹结构和模块描述符(pom.xml 文件)。如果您多次需要它,使用简单的 shell 脚本或批处理文件将很容易做到这一点。
【讨论】:
我不确定我是否正确理解了你的问题,但是为了创建一个多模块项目,我通常使用一个简单的 pom(在根级别):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vijaykiran</groupId>
<artifactId>myproject-parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>m1</module>
<module>m2</module>
</modules>
</project>
这可能是您可以使用的最简单的多模块父 pom。您要创建的项目可能已经有一个原型,可以帮助您创建结构。虽然您可以从 IDE 获得帮助来自己编写 pom,但如果您想要构建的项目类型有可用的原型,则通常更容易使用它。
【讨论】:
archetype:generate 这样的交互式命令询问我是否要创建一个多模块项目,如果是,它包含哪些模块,然后它会为我创建 pom.xml 文件。
如果您正在使用 Eclipse IDE,您应该使用m2eclipse plug-in。这是创建多模块项目的最简单方法之一。您可以通过在 Eclipse 中创建一个“Maven 模块项目”来为每个 Maven 项目添加一个模块。执行此操作时,您可以选择父项目。插件做所有事情,意味着它将新模块复制到父模块并修改 pom.xml 文件。
【讨论】:
与Chris H. 的答案相同,我只是添加了 groupId、artifactId 和 version 选项并禁用了交互模式。
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=pom-root \
-DarchetypeVersion=RELEASE \
-DinteractiveMode=false \
-DgroupId=com.mycompany.app \
-DartifactId=my-app \
-Dversion=1.0.0-SNAPSHOT \
【讨论】:
考虑一个父项目的书签和3个子模块rest、security和model,参考Spring docs。 它没有 Spring 文档中的依赖关系,只是从多模块的角度来看的基本设置。
以非交互模式/批处理模式创建父maven项目
mvn archetype:generate \
-DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=pom-root \
-DarchetypeVersion=RELEASE \
-DgroupId=bookmarks \
-DartifactId=bookmarks \
-Dversion=0.0.1-SNAPSHOT \
-DinteractiveMode=false
以非交互模式/批处理模式创建子模块。
cd 进入你新创建的根目录。参考@Chris.H的回答
-Dpackage 是包结构。这里是书签。 如果未指定,则将 artifactId 视为默认包
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=model \
-DartifactId=model \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false
要在 eclipse 中创建一个新模块,转到 File->new->other->maven->maven 模块,这会立即显示在 eclipse 工作区包资源管理器中。
或者从 cli,cd 里面的父文件夹,这里的书签和运行以下,它会 创建项目,然后您必须作为 maven 项目导入 eclipse,或者可以从父项目工作,此处为书签项目
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=security \
-DartifactId=security \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false
【讨论】:
如果您想避免 xml 复制粘贴,只需简单的 4 个步骤。
创建一个 284(默认)原型项目。打开创建的 pom 文件,将包装从 jar 更改为 pom
从项目中删除 src 文件夹 - 现在这是没有 src 的父项目,因为包装是 pom.xml 。 在上面的文件夹中创建另一个新项目(默认为 284)。将包装更改为 war 或 ejb 或 ear。这成为子模块。
在每个模块上执行 mvn eclipse:eclipse。现在该项目应该可以作为 Eclipse 项目导入了。
在导入项目时,Eclipse 会报错如下 pom.xml 的项目配置不是最新的。运行 Maven->Update Project 或使用 Quick Fix。 为避免上述错误,请右键单击并选择快速修复。这将更新 POMS。避免此错误的另一种方法是在 Parent pom 中声明子模块
更多详情请参考以下链接。 http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Example_1
【讨论】: