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

时间:2014-04-25 00:02:51

标签: java maven

考虑这个结构

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>

这与component1/pom.xml 相同,但

除外
<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>

当我尝试使用不同的模块名称时,它可以正常工作

2 个答案:

答案 0 :(得分:1)

正如@ jigar-joshi所指出的那样,maven需要一种方法来区分persistence的{​​{1}}模块和component1的{​​{1}}模块。它的工作方式是persistencecomponent2的组合。对于每个groupId模块(或artifactIdpersistence),此组合必须是唯一的。

因此,每个business要么必须有唯一的rest(比如persistencegroupId),要么只有com.org.component1 com.org.component2artifactId)。

答案 1 :(得分:0)

不仅maven将与项目的实际分层混淆,但有一天你会迷失在这两个模块中,你不会知道哪个是这个或那个。

因为@Raghuram指出每个模块都需要一个唯一标识符,因此拥有唯一的 groupId 或唯一 artifcatId (在你的项目范围内,甚至尊重其他工件,否则你会得到奇怪的冲突。)

这是为了唯一性的目的,但是应遵循一些约定,您将自动解决可能由模块/项目命名引起的任何麻烦:

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

  • artifactId :此工件的标识符在组ID 给出的组中是唯一的。

只要按照这些方针行事,你就不会安全,但会制作符合练习规则的套餐。