如何创建一个空的多模块Maven项目?


75

现在,我通常会pom.xml在网络上找到一个带有pom包装的文件,然后将其复制并粘贴以创建我的父项目。然后,我曾经archetype:create在父目录中运行来创建子模块,但是archetype:create从那以后就不推荐使用了。

关于如何创建新的Maven多模块项目的任何建议?

java  maven 

Answers:


125

我发现最简单的方法是使用pom-root原型创建顶级pom,然后重复使用archetype:generate以单独创建每个模块。这将自动将模块添加到root pom(聚合器),并将root pom设置为每个模块的父pom(编辑:显然,某些原型可以具有硬编码的父代,但它适用于maven-archetype-quickstart)。

细目如下:

  1. 创建顶级根目录:

    mvn archetype:generate \
    -DarchetypeGroupId=org.codehaus.mojo.archetypes \
    -DarchetypeArtifactId=pom-root \
    -DarchetypeVersion=RELEASE
    
  2. cd 到新创建的根目录中。

  3. 对于每个模块:

    mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=RELEASE
    

请注意,-DarchetypeVersion=RELEASE以上将自动使用最新版本的原型。您可能希望添加-DgroupId=...到每个命令中以避免重复自己。


3
使用-Dfilter = pom-root将为您提供一个选择,而不必选择原型组和工件ID,并且如果您删除archetypeVersion,则只有几个选项可供选择。对于那些讨厌打字的人来说,这可能是一条更容易的途径。:-)
Spencer Kormos 2014年

我认为复制/粘贴对于那些讨厌打字的人来说是最好的;),所以我将命令改为多行,以便于复制/粘贴。
克里斯H.14年

是的,但是我只是为了将来的证明而添加。:-D
Spencer Kormos 2014年

7
令人遗憾的是,我仍然来复制和粘贴此内容,而不是仅仅依靠mvn实用程序。
丹尼尔·格森

1
大!谢谢你的提示。
2015年

46

这是有关如何使用Intellij Idea做到这一点的截屏视频。首先,启动一个新项目(文件->新建项目),选择“ Maven模块”:

在此处输入图片说明

输入名称,单击下一步,在以下步骤中不要更改任何其他内容,单击完成。

现在以您的pom.xml类型输入<packaging>并启用自动更新:

在此处输入图片说明

输入模块:

在此处输入图片说明

将光标放在m1,然后按Alt+Enter

在此处输入图片说明

模块m1将自动添加到您的项目中。现在你可以做Alt+Enterm2,就是这样。

在此处输入图片说明

您还可以从pom.xml为项目的现有模块添加开始:在项目树中的“添加框架支持...”上单击鼠标右键,选择“ Maven”。这将创建一个pom.xml


伙计,这是一个了不起的有用的答案。我可以在twitter / stackoverflow答案等中关注您吗?
Rinor

确保将那些包装<module>m1</module><modules>标签内。我是pom文件的新手,最终花了大量时间在为什么alt + enter不显示任何提及的选项上。
unknownerror '18年

21

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-root的号码已更改。目前,它是449
mwoodman

@mwoodman感谢您的提示。我修改了答案,使其在以后的更改中具有通用性。
Axel Knauf

2
仅供参考,数字会根据您从中获取的存储库而变化。

2
使用-Dfilter = pom-root消除了对文档编号的需求,并将结果减少为一。
Spencer Kormos 2014年

9

我不确定我是否正确理解了您的问题,但是对于创建多模块项目,我通常使用简单的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,但是如果要构建的项目类型有可用的原型,通常使用它会更容易。


6
我的意思是,记住POM文件的格式很困难,而每次从头开始编写它都是浪费时间。这样,每次我要创建一个新项目时,我都会复制并粘贴pom文件的内容,并将其保存到新项目的pom.xml中。我正在寻找一种更纪律有效的方法来创建多模块项目。例如,这样的交互式命令archetype:generate会问我是否要创建多模块项目,如果要创建,则它包含哪些模块,然后pom.xml为我创建文件。

6

如果您使用的是eclipse IDE,则应使用m2eclipse插件。这是创建多模块项目的最简单方法之一。您可以通过在eclipse中创建“ Maven Module-Project”,将模块添加到每个Maven项目。这样做时,您可以选择一个父项目。该插件执行所有操作,这意味着它将新模块复制到父模块并修改pom.xml文件。


5

Chris H相同的答案我只是添加了groupId,artifactId和版本选项,并禁用了交互模式。

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  \

4

考虑一个父项目书签,其余3个子模块,安全性和模型,请参阅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 

1

如果要避免xml复制粘贴,请执行简单的4个步骤。

  1. 创建一个284(默认)原型项目。打开创建的pom文件,将包装从jar更改为pom

  2. 从项目中删除src文件夹-由于打包是pom,因此这是没有src的父项目。在上面的文件夹中创建另一个新项目(默认为284)。将包装更改为war或ejb或ear。这成为子模块。

  3. 在每个模块上执行mvn eclipse:eclipse。现在,该项目应该已准备就绪,可以作为Eclipse项目导入。

  4. 在导入项目时,Eclipse会抱怨以下项目配置不是pom.xml的最新内容。运行Maven->更新项目或使用快速修复。为避免上述错误,请右键单击并选择快速修复。这将更新POMS。避免此错误的另一种方法是在父pom中声明子模块

请参考以下链接以获取更多详细信息。 http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Example_1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.