Рассмотрим эту структуру
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>
Когда я пытаюсь иметь другое имя модуля, оно работает
Как указано в @jigar-joshi, maven нуждается в способе различать модуль persistence
component1
и модуль persistence
component2
. То, как это происходит, - это сочетание groupId
и artifactId
. Эта комбинация должна быть уникальной для каждого модуля persistence
(или для business
и rest
в этом отношении).
Таким образом, каждая persistence
должна иметь уникальную groupId
(скажем com.org.component1
и com.org.component2
) или уникальный artifactId
(component1-persistence
и component2-persistence
).
Не только maven получает будет путать с фактическим расслоением вашего проекта, но в какой-то день вы потеряетесь с обоими модулями, и вы не будете знать, кто из них тот или иной.
Так как @Raghuram указал, вам понадобится уникальный идентификатор для каждого модуля, таким образом, имея уникальный уникальный идентификатор groupId или уникальный artifcatId (в рамках вашего проекта и даже с учетом других артефактов, или вы получите странные конфликты).
Это необходимо для уникальной цели, но некоторые соглашения должны соблюдаться, и вы автоматически получите свое "я" от любых проблем, которые могут быть вызваны именами модулей/проектов:
goupId: универсальный уникальный идентификатор для проекта. Это нормально использовать полное имя пакета, чтобы отличить его от других проектов с похожим именем (например, org.apache.maven).
artifactId: Идентификатор этого артефакта, который уникален в группе, заданной идентификатором группы.
Просто следуйте этим строкам, и вы даже не будете в безопасности, но создадите пакеты, соответствующие правилам практики.