我有一些复杂的项目结构,我想通过Maven来构建。我正在使用我的本地存储库(.m2/repository
),所以请记住这一点!在讨论这个问题之前,我想先分享一下我目前拥有的结构:
+- pom.xml
+- runtimeProject1
| +- pom.xml
+- runtimeProject2
| +- pom.xml
+- runtimeProject3
| +- pom.xml
+- sharedProjects
| +- pom.xml
| +- sharedProject1
| | +- pom.xml
| +- sharedProject2
| | +- pom.xml
| +- sharedProject3
| +- pom.xml
+- coreProjects
+- pom.xml
+- coreProject1
| +- pom.xml
+- coreProject2
| +- pom.xml
+- coreProject3
+- pom.xml
总之,我的工作空间有两个子目录,其中有与自己的任务相关的模块,以及应该使用core
和shared.
项目的运行时项目。每个项目都有一个pom.xml
文件,正如您所看到的,我还为父母准备了pom.xml
文件。一切都是通过本地存储库完成的,所以请记住这一点。
现在,在sharedProjects
和coreProjects
的目录下分别运行mvn install
可以正常工作。我看到成功的输出,说一切正常。当我从根文件夹(顶级pom.xml
)运行相同的命令时,就会出现这个问题。我面临以下警告:
[WARNING] Some problems were encountered while building the effective model for runtimeProjects:runtimeProject1:jar:1.0.0
[WARNING] 'dependencies.dependency.systemPath' for coreProject:com.google.protobuf:jar should not point at files within the project directory, ${project.basedir}/../coreProject/com.google.protobuf/protobuf-java-2.5.0.jar will be unresolvable by dependent projects @ line 31, column 22
[WARNING] 'dependencies.dependency.systemPath' for sharedProject:org.boofcv:jar should not point at files within the project directory, ${project.basedir}/../sharedProject/org.boofcv/GeoRegression.jar will be unresolvable by dependent projects @ line 43, column 22
[WARNING] 'dependencies.dependency.systemPath' for sharedProject:org.boofcv:jar should not point at files within the project directory, ${project.basedir}/../sharedProject/org.boofcv/BoofCV.jar will be unresolvable by dependent projects @ line 50, column 22
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: sharedProject:org.boofcv:jar -> duplicate declaration of version 1.0.0.qualifier @ line 45, column 16
[WARNING] 'dependencies.dependency.systemPath' for sharedProject:javax.vecmath:jar should not point at files within the project directory, ${project.basedir}/../sharedProject/javax.vecmath/vecmath.jar will be unresolvable by dependent projects @ line 62, column 22
,然后错误地说某些package do not exist
,我猜这是由于这个并发症。
我想我需要改变这里的一个pom.xml
,但不知道哪一个和如何。
更新:我决定分享我使用一些.jar
文件作为依赖的方式,所以它是这样的:
<dependency>
<groupId>coreProjects</groupId>
<artifactId>com.google.protobuf</artifactId>
<version>2.5.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../coreProjects/com.google.protobuf/protobuf-java-2.5.0.jar</systemPath>
</dependency>
<dependency>
<groupId>coreProjects</groupId>
<artifactId>org.apache.felix</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../coreProjects/org.apache.felix/felix.jar</systemPath>
</dependency>
注意,这些在coreProjects
和sharedProjects
文件夹下工作得很好。只是不符合runtimeProject
(s),因此我的问题。
好吧,从评论员那里得到很多"不要使用systemPath
和system
作为范围"的警告后,我重组了我的构建策略,现在我不使用任何系统相关的东西。然而,问题依然存在。现在我像这样指定依赖项(你可以看到这里没有路径相关的东西):
<dependency>
<groupId>coreProjects</groupId>
<artifactId>coreProject2</artifactId>
<version>1.0.0.qualifier</version>
</dependency>
<dependency>
<groupId>coreProjects</groupId>
<artifactId>coreProject1</artifactId>
<version>1.0.0.qualifier</version>
</dependency>
<dependency>
<groupId>sharedProjects</groupId>
<artifactId>org.boofcv</artifactId>
<version>[1.0,)</version>
</dependency>
所以我们是安全的,我相信。上述警告已不复存在。到目前为止,我只得到package does not exist
错误。这很奇怪,因为它抱怨的包是在根目录的pom.xml
文件中引用的。例如,其中一个错误如下:
package org.osgi.framework does not exist
然而,另一件事引起了我的注意。我遇到的另一个错误,没有直接给出包的名称,而是该包的一部分。例如,如果包名为somePackageName
,则错误显示为somePackageName.somePart does not exist
。所以它不是全部,而只是一部分,这让我更加困惑。这可能是什么原因?
好吧,似乎有一个简单的错误,我在做。我的proto
文件在错误的目录下被转换为java
文件,导致package does not exist
错误。所以,如果你看到这个错误,如果你以某种方式利用协议缓冲区,检查你的pom.xml
antrun-plugin
。确保它在正确的目录下运行。在这里,我分享了我的antrun-plugin
部分,用于生成我的原型文件。您可以看到,目录确实很重要,因此要非常小心使用它们。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<mkdir dir="src-gen"/>
<exec executable="protoc">
<arg value="--java_out=src-gen"/>
<arg value="proto/file1.proto"/>
<arg value="proto/ros/file1.proto"/>
<arg value="proto/ros/file2.proto"/>
<arg value="proto/environment/file1.proto"/>
</exec>
</tasks>
<sourceRoot>src-gen</sourceRoot>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>