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>