Java 使用Maven更智能地处理本机依赖关系

Java 使用Maven更智能地处理本机依赖关系,java,dependencies,maven-3,Java,Dependencies,Maven 3,我目前正在将一个大型多模块项目(约100个子模块)转换为使用Maven。目前我们使用Ant+Ivy 到目前为止还没有出现重大问题,我很高兴Maven仍然是一个很好的人选。但是,我想知道是否有更好的方法来处理本机依赖关系 到目前为止,我得出以下结论 最好将每个本机依赖项作为独立库或包含多个依赖项的归档包安装到maven repo中 与使用Maven dependency插件声明每个依赖项不同,我选择为每个依赖项提供一个分类器(例如natives-win32),并在父POM中使用以下内容:

我目前正在将一个大型多模块项目(约100个子模块)转换为使用Maven。目前我们使用Ant+Ivy

到目前为止还没有出现重大问题,我很高兴Maven仍然是一个很好的人选。但是,我想知道是否有更好的方法来处理本机依赖关系

到目前为止,我得出以下结论

  • 最好将每个本机依赖项作为独立库或包含多个依赖项的归档包安装到maven repo中
  • 与使用Maven dependency插件声明每个依赖项不同,我选择为每个依赖项提供一个分类器(例如natives-win32),并在父POM中使用以下内容:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <includeScope>runtime</includeScope>
                        <includeClassifiers>natives-win32</includeClassifiers>
                        <outputDirectory>${project.build.directory}/natives</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    
    
    org.apache.maven.plugins
    maven依赖插件
    2.4
    复制
    编译
    复制依赖项
    运行时
    本地人-win32
    ${project.build.directory}/natives
    
  • 到目前为止,这似乎是一个简单的全面解决方案,不需要太多的麻烦来添加新的本机依赖项。它还为我提供了一个管理本地人的简单全面的解决方案。我必须做的唯一一件事是确保在java.library.path上定义了我的/natives/目录

    这种方法(有点)困扰我的一件事是,我的所有本机依赖项都被复制到每个表示对它们的可传递依赖项的子模块,而我的happy jar库被添加到它们位于本地存储库中的引用类路径中(无需复制)

    有没有办法更聪明一点,让我的本地人从他们的存储库位置被引用(假设我没有将他们存档,即dll)。这将节省大量不必要的复制


    对于上述方法,我还应该关注其他潜在的问题吗?

    您的代码片段显示了附加到构建阶段的目标,而不是依赖关系。超级pom中的“复制依赖项”目标是否由所有模块继承?无法将其仅移动到将作为应用程序运行/打包的模块

    可能是因为我没有得到它。但是为什么不首先将所有本机lib部署到存储库中呢。如果天然LIB稳定且很少变化,则可在单独的反应器中进行


    之后,您只需通过GAV将这些本机依赖项作为任何其他依赖项引用。另外,不必要的复制问题也由此解决。

    我最终使用了,并处理了本地库的冗余副本这一事实。这主要是因为该插件提供了简单性,而且它还有一个相关的eclipse插件,可以在eclipse环境中为开发者设置本地人,而无需干预。

    您是如何通过Ivy解决这个问题的?你描述的方式?我们的常春藤配置似乎解决得很糟糕。首先,eclipse的调试/运行配置通过引用共享存储库(每个开发人员机器上的映射目录)中的每个单独的配置来设置运行时依赖项。在部署或测试时,ant脚本会根据需要接管并移动依赖项。真是一团糟。嗯,我喜欢你的解决方案。似乎您真正想要的是依赖项插件的另一个目标,该插件将属性设置为已解析依赖项的路径列表。这将是拼图的最后一块。应该很容易,为什么不试试补丁呢?如果你成功地编写了这样一个补丁,请告诉我,我会考虑应用它。最后,我选择了使用。原因是它包含一个eclipse插件,可以无缝地设置开发人员环境以包含本机依赖项。我只是对复制多个LIB的后果进行了解释,因为在一天结束时,大多数本地人都以捆绑的形式存在,这些捆绑都是压缩的,随后必须解包。也许将来可以实现一个maven插件,它至少可以将它们解压缩到本地的“暂存”区域以供重复使用。干杯。为了记录在案,我使用了Mavenatives插件并对其进行了改进。它提供了相同的功能,并通过不下载与您的平台无关的本机依赖项等方式提高了速度。如果感兴趣,请在此处查找nativedependencies maven插件: