Java Maven:我怎么能在两个不同的模块下有一个同名的模块?

Java Maven:我怎么能在两个不同的模块下有一个同名的模块?,java,maven,Java,Maven,以这种结构为例 project pom.xml component1/ pom.xml persistence/pom.xml business/pom.xml rest/pom.xml component2/ pom.xml persistence/p

以这种结构为例

project
       pom.xml
       component1/
                 pom.xml
                 persistence/pom.xml
                 business/pom.xml
                 rest/pom.xml
       component2/
                 pom.xml
                 persistence/pom.xml
                 business/pom.xml
                 rest/pom.xml
当我尝试这样做时,我得到
NullPointerException

[ERROR] Internal error: java.lang.NullPointerException -> [Help 1]
org.apache.maven.InternalErrorException: Internal error: java.lang.NullPointerException
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:167)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: java.lang.NullPointerException
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:270)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
    ... 11 more
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/InternalErrorException
我可以没有这样的结构吗?我使用的是
Maven 3.2.1

这就是
component2/pom.xml
的外观

<parent>
    <groupId>com.org</groupId>
    <artifactId>component2</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>persistence</artifactId>
<version>1.0-SNAPSHOT</version>

当我尝试使用一个不同的模块名时,正如@jigar joshi所指出的那样,maven需要一种方法来区分
组件1的
持久化
模块和
组件2的
持久化
模块。它的方式是通过组合
groupId
artifactId
。对于每个
persistence
模块(或
business
rest
),此组合需要是唯一的


因此,每个
持久化
都需要一个唯一的
groupId
(比如
com.org.component1
com.org.component2
)或者一个唯一的
artifactId
component1持久化
component2持久化

不仅maven gets会与您的项目的实际分层混淆,而且有一天您会对这两个模块感到迷茫,不知道哪一个是这个还是那个

正如@Raghuram所指出的,每个模块都需要一个唯一的标识符,因此通过拥有唯一的groupId或唯一的artificatid(在您的项目范围内,甚至尊重其他工件,否则您将遇到奇怪的冲突)

这是为了唯一性,但应遵循一些约定,您将自动摆脱模块/项目命名可能导致的任何问题:

  • goupId:项目的通用唯一标识符。通常使用完全限定的包名将其与具有类似名称的其他项目(例如org.apache.maven)区分开来

  • artifactId:此工件的标识符,在组ID所给定的组中是唯一的


只需遵循这些规则,你甚至不会安全,但会产生遵守实践规则的包。

它们都有不同的组id,对吗?它们应该有不同的组id,你能尝试addine多一级命名吗?不清楚我是否理解,你能解释一下吗?如果你可以为两个
持久性
包使用不同的组id,那么简单的事情就是:artifactId在一个组id中必须是唯一的。因此,如果您需要有两个同名的artifactId,那么您需要有一个不同的groupId,否则这是不可能的。在java中,包中的java类也是如此。
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.org</groupId>
    <artifactId>component1</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>persistence</artifactId>
<packaging>pom</packaging>