考虑这个结构
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>
当我尝试使用不同的模块名称时,它可以正常工作
答案 0 :(得分:1)
正如@ jigar-joshi所指出的那样,maven需要一种方法来区分persistence
的{{1}}模块和component1
的{{1}}模块。它的工作方式是persistence
和component2
的组合。对于每个groupId
模块(或artifactId
和persistence
),此组合必须是唯一的。
因此,每个business
要么必须有唯一的rest
(比如persistence
和groupId
),要么只有com.org.component1
com.org.component2
和artifactId
)。
答案 1 :(得分:0)
不仅maven将与项目的实际分层混淆,但有一天你会迷失在这两个模块中,你不会知道哪个是这个或那个。
因为@Raghuram指出每个模块都需要一个唯一标识符,因此拥有唯一的 groupId 或唯一 artifcatId (在你的项目范围内,甚至尊重其他工件,否则你会得到奇怪的冲突。)
这是为了唯一性的目的,但是应遵循一些约定,您将自动解决可能由模块/项目命名引起的任何麻烦:
goupId :项目的通用唯一标识符。使用完全限定的包名称来区别于具有类似名称的其他项目(例如org.apache.maven)是正常的。
artifactId :此工件的标识符在组ID 给出的组中是唯一的。
只要按照这些方针行事,你就不会安全,但会制作符合练习规则的套餐。