6

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

到目前为止,还没有出现任何重大问题,我很满意 Maven 仍然很合适。但是,我想知道是否有更好的方法来处理本机依赖项。

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

  1. 最好将每个本机依赖项作为独立库或包含多个依赖项的存档包安装到 maven 存储库中。
  2. 我没有迷失在使用 Maven 依赖插件声明每个依赖项,而是选择给每个分类器(例如 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>
    

到目前为止,这似乎是一个简单的全方位解决方案,不需要太多的麻烦来添加新的本机依赖项。它还为我提供了一个简单的全方位解决方案来管理本地人。我唯一必须做的就是确保我的 /natives/ 目录是在 java.library.path 上定义的。

关于这种方法让我(有点)困扰的一件事是,我的所有本机依赖项都被复制到每个子模块中,这些子模块表达了对它们的传递依赖,而我的快乐 jar 库被添加到引用它们所在位置的类路径中我的本地存储库(不需要副本)。

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

对于上述方法,我还应该关注其他任何潜在的陷阱吗?

4

3 回答 3

0

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

于 2012-04-23T17:16:17.580 回答
0

可能是,我没有得到它。但是为什么不首先将所有本机库部署到存储库中。如果本机库稳定且很少更改,则可以在单独的反应器中完成。

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

于 2012-09-25T05:47:23.793 回答
0

我最终使用了maven natives 插件并处理了我周围有本地库的冗余副本这一事实。这样做的原因主要是由于该插件提供的简单性以及它还有一个相关的 eclipse 插件,该插件可以在开发人员 eclipse 环境中设置本机而无需干预。

于 2012-10-08T13:44:12.700 回答