具有本机依赖性和复制文件的Maven项目

时间:2011-09-22 13:28:12

标签: dll maven dependencies copy transitive-dependency

我有以下情况:

mylib是一个库(我有源​​代码,因此我想将它们放入Maven项目mylib:mylib中)。这个库有一个jar依赖项,我只有jar,而且它不能在Maven存储库中找到(我也不想在那里安装它)。为了使其编译,这样的东西将起作用:将jar文件添加到“lib”文件夹中的mylib项目,例如, “lib / thirdpartylib.jar”和mylib的pom.xml中,添加一个自选组/工件/版本和“<scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>”条目的依赖项。 mylib项目编译正常。

请注意,mylib还对dll文件有运行时依赖性,比如thirdparty.dll。但是对于编译来说这并不重要。

然而,现在我想知道如何实现以下目标:

任何其他项目,例如项目“X”,使用 mylib,需要

- mylib.jar
- thirdpartylib.jar
- thirdpartylib.dll

并且必须将java.library.path设置为目录(例如“。”),以便执行VM找到第三方jar和dll。

我担心的是:我希望第三方jar / dll是mylib项目的责任。即我想定义知识,你需要将第三方jar和dll复制到目标文件夹,并且java.library.path引用它们,成为mylib项目的一部分(mylib pom知道该如何成为用于其他项目)。然而,我希望这些知识(即复制指令,无论它们如何在Maven中完成)都可以传递地移交给使用mylib的任何其他项目,例如X.这有可能吗?

[我现在的黑客解决方案是我在X中有第三方的副本,但即便如此我也不知道如何复制/处理dll文件,所以我必须写一个自述文件,说是必须将dll文件复制到正在执行的VM的bin文件夹中。

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:13)

我建议将文件转换为Maven模块,方法是使用Maven install plug-in

将它们安装到本地存储库中
mvn install:install-file \
    -DgroupId=com.demo \
    -DartifactId=thirdpartylib \
    -Dversion=1.0 \
    -Dfile=thirdpartylib.jar

mvn install:install-file \
    -DgroupId=com.demo \
    -DartifactId=thirdpartylib-runtime \
    -Dversion=1.0 \
    -Dpackaging=dll
    -Dfile=thirdpartylib.dll

这种方法的一个巧妙之处是Maven POM将自动生成。

mylib 项目现在将第三方模块声明为其POM文件中的正常依赖项:

<dependencies>
    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>thirdpartylib</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>thirdpartylib-runtime</artifactId>
        <version>1.0</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

现在当 mylib 模块被其他模块引用(作为依赖项)时,第三方模块也将作为传递依赖项下载。

答案 1 :(得分:2)

基本理念如下:

  • Maven善于处理每个Maven POM的一个结果。
  • 只能在本地存储库中拥有这些库的库和依赖项。

所以你必须执行以下步骤:

  1. 为附加库定义一个单独的项目(或项目中的模块),并将库定义为结果。
  2. 更改您的POM,以便此POM现在依赖于新项目。
  3. 为您的DLL执行相同的步骤(请参阅帖子Managing DLL dependencies with Maven)如何执行此操作。)
  4. 将您的附加库和DLL部署到本地存储库。
  5. 现在您应该可以再次使用Maven进行构建过程,并且通过使用maven-assembly-plugin之类的其他插件,您可以将所有插件打包在一起。