我有一个带有子模块a:jar
的项目,它需要一组不同的依赖项,这取决于它是为哪个平台编译的。所有平台的代码都是相同的。例如,在Android上,httpcomponents库已经与操作系统捆绑在一起,而我必须将其包含在J2SE环境的构建中。我还有另一个子模块,它将几个子模块及其依赖关系组装到一个档案中。我如何可靠地配置组装子模块,以获取为相应平台编译的所有子模块及其适用于该平台的依赖关系?
我尝试使用配置文件创建a:jar:android
和a:jar:j2se
。但是,对其中一个声明依赖项会导致程序集中出现奇怪的依赖项。也就是说,程序集项目的dependency:tree
有时会包括对a:jar:j2se
的依赖项(无论我在程序集中声明使用a:jar:android
还是a:jar:j2se
(,有时还会包括其他依赖项。在我更新了本地存储库中a
的jar之后,它(经常(发生了变化。在部件项目中切换也会使用纵断面。
我可以通过将与单个子模块概要文件所需的依赖项相同的依赖项应用于组装项目的概要文件来解决这个问题。但由于我必须在POM中重复我自己,可能有一种更专业的方法来实现这一点。由于我对maven还很陌生,我想知道它是什么?我不想复制代码(由于代码保持不变,这将更加重复(,我也不喜欢复制POM的部分,因为由于版本升级而更改它们可能会变得复杂。
一些具体材料:来自a:jar
的POM:的依赖性
<dependencies>
.....
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
<!-- Exclusion in the common part, they are provided in the profiles from different sources -->
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
....
</exclusions>
</dependency>
</dependencies>
<profiles>
<profile>
<id>android</id>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>1.6_r2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>java</id>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
</profiles>
组装项目(使用Maven assembly插件(概要文件:
<profiles>
<profile>
<id>android</id>
<dependencies>
<dependency>
<groupId>a</groupId>
<artifactId>a</artifactId>
<version>${project.version}</version>
<classifier>android</classifier>
<type>jar</type>
</dependency>
<!-- Duplicate -->
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>1.6_r2</version>
<scope>provided</scope>
</dependency>
<!-- Duplicate -->
</dependencies>
</profile>
<profile>
<id>java</id>
<dependencies>
<!-- Duplicate -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
<!-- /Duplicate -->
<dependency>
<groupId>a</groupId>
<artifactId>a</artifactId>
<version>${project.version}</version>
<classifier>java</classifier>
<type>jar</type>
</dependency>
</dependencies>
</profile>
</profiles>
我想去掉标记的依赖声明。
有几种解决方案:
-
这些子模块的依赖关系可以被声明为"提供",在这种情况下,在项目中,您可以将对子模块的依存关系以及平台没有的显式依存关系包括在内。
-
对于不必要的依赖项,请使用
<exclusions>
。 -
使用上面的(1(或(2(创建另一个"结构"子模块a-android:pom a-j2se:pom,它只描述依赖关系,并使用项目中的这些模块。
您可以向pom添加一个maven配置文件,并根据操作系统激活每个配置文件。配置文件激活确实支持这样的选项。然后,在每个特定于操作系统的配置文件中,您可以列出可选的依赖项。这是一篇关于个人资料的文章->http://maven.apache.org/guides/introduction/introduction-to-profiles.html
在你的情况下,它会是这样的:
<profiles>
<profile>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<dependencies>
... specific dependencies for Windows
</dependencies>
<plugins>
... specific build plugins for Windows
</plugins>
</profile>
<profile>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<dependencies>
... specific dependencies for unix
</dependencies>
<plugins>
... specific build plugins for unix
</plugins>
</profile>
<dependencies>
... Common dependencies
<dependencies>
<plugins>
... Common build plugins
</plugins>
</profiles>