我目前正在将一个大型多模块项目(约 100 个子模块)转换为使用 Maven。目前我们使用 Ant + Ivy。
到目前为止,还没有出现任何重大问题,我很满意 Maven 仍然很合适。但是,我想知道是否有更好的方法来处理本机依赖项。
到目前为止,我得出了以下结论。
- 最好将每个本机依赖项作为独立库或包含多个依赖项的存档包安装到 maven 存储库中。
我没有迷失在使用 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)。这将节省一堆不必要的复制。
对于上述方法,我还应该关注其他任何潜在的陷阱吗?