如何告诉Maven包含jar依赖项,而不是Eclipse中的子项目源目录?

时间:2012-09-25 06:17:09

标签: java eclipse maven

我使用Apache Maven来管理我的Java库(jar)和一些使用libs的项目。为了方便起见,我使用mvn eclipse:eclipse生成 Eclipse项目文件,可以将其导入Eclipse工作区进行编辑。

当我在同一个Eclipse工作区中编辑主项目和Java lib项目时出现问题。也就是说,mvn eclipse:eclipse.classpath文件中包含 src path 依赖项,而不是预期的jar依赖项。

假设我有一个名为mylib的Jave lib项目。相应的jar文件mylib.jar已部署到由我维护的私有Maven仓库中。为了在主项目中使用mylib.jar,pom.xml中包含以下依赖项。

<!-- pom.xml for the main project -->
<dependency>
  <groupId>namespace.my</groupId>
  <artifactId>mylib</artifactId>
  <version>[1.0, )</version>
</dependency>

mvn compilemvn test工作正常,mylib.jar会从我的回购邮件中自动下载。但是,在尝试mvn eclipse:eclipse时,我发现生成的.classpath文件不包含mylib.jar依赖项。相反,它包括mylib的源文件目录,如下所示。

<!-- .classpath file generated by mvn eclipse:eclipse -->
<classpathentry kind="src" path="/mylib"/>

似乎Maven读取Eclipse的元数据并找到mylib并且主项目在同一工作区中共存。因此,maven包含了我的好处。该死的。如何告诉maven忽略本地项目源并只包含jar文件?

6 个答案:

答案 0 :(得分:12)

我相信这实际上是因为它们是Eclipse中的相​​关项目。因此,如果您右键单击主项目并转到Project References,则应勾选您的lib项目。

如果您运行mvn eclipse:eclipse,它将自动为任何子项目(模块)添加项目引用。您可以使用maven eclipse插件的useProjectReferences属性更改此内容。

默认为true,但

  

设置为false时,插件不会创建子项目   使用本地安装的软件包引用这些子项目   存储库

要使用该属性,请在pom.xml中设置该属性

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <useProjectReferences>false</useProjectReferences>
            </configuration>
        </plugin>
    <plugins>
<build>

或者作为命令行上的属性:

mvn eclipse:eclipse -Declipse.useProjectReferences=false

答案 1 :(得分:11)

我需要避免将依赖项包含为refrenced项目,而是作为jar。 使用Eclipse 4.6 Neon以前的解决方案都不起作用。

我已停用Workspace Resolution功能

click on the project -> Maven -> Disable Workspace Resolution

答案 2 :(得分:0)

感谢Hound Dog的提示。是的,useProjectReferences控制Maven如何处理子项目 - 包括源目录或包含jar文件。

我没有安装Eclipse的maven插件,因此我在pom.xml中添加了以下配置。它告诉Maven在本地maven repo中包含jar依赖,而不是源dir。如果本地仓库中没有所需的jar文件,它将自动下载。

  <!-- pom.xml for the main project: include jar, not src path -->
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-eclipse-plugin</artifactId>
    <version>2.9</version>
    <configuration>
            <useProjectReferences>false</useProjectReferences>
    </configuration>
  </plugin>

现在mvn eclipse:eclipse按预期工作。

答案 3 :(得分:0)

尝试在依赖标记内部使用type元素,并在pom.xml中提及source / jar作为类型

<!-- pom.xml for the main project --> 
<dependency>
   <groupId>namespace.my</groupId>
   <artifactId>mylib</artifactId>
   <version>[1.0, )</version>
   <type>jar<type> <!-- source/jar -->
 </dependency> 

答案 4 :(得分:0)

我最近遇到过这种行为是由pom.xml文件中声明的版本触发的。如果您的主项目依赖的lib版本可用于工作空间中的eclipse(例如,具有匹配的pom.xml [group,artifact,version]的项目),这将被用作项目引用而不是被从M2REPO位置拉出来。

我的解决方案是将工作区中的库pom.xml的版本更改为允许我改进lib的另一个版本,而主项目仍然从M2REPO中删除了较旧的库。

通过对齐版本号来使用它可以让您轻松地执行并发工件改进/更改。

我还没有测试每次更改lib pom.xml文件和主pom.xml依赖项时是否需要运行mvn eclipse:eclipse,但我希望它是这样。

答案 5 :(得分:0)

我试图在eclipse&amp; amp;工作区刚建好了,这次从存储库中取出jar而不是链接项目