java - Maven 打包几个阴影罐子
问题描述
我目前正在运行一个多模块 maven 项目,并且在每个模块中我正在生成一个阴影 jar。这些 jars 旨在单独运行,因为它们代表三个不同的 Spark 作业。
然而,为了让它们更容易“运送”到某个地方,我想把所有这些有阴影的罐子都拉上拉链。我试过使用程序集插件来实现这一点,但我很挣扎。
当我尝试使用模块集时,它似乎只抓住了未着色的 jar。
我已经能够使用文件集来实现这一点,但它不是很优雅,而且它不能处理我有开发和生产版本的事实,这些版本会改变阴影 jar 的命名。
我假设模块集仍然是正确的方法,但我不知道如何让它抓住我的阴影罐子,只有阴影罐子。任何人都可以帮忙吗?
解决方案
1) 一个带有阴影 jar 项目的父 pom,然后是一个分发项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.greg</groupId>
<artifactId>assembly-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>assembly-example</name>
<modules>
<module>shaded-jar-1</module>
<module>shaded-jar-2</module>
<module>distribution</module>
</modules>
</project>
2)像这样的阴影 jar 项目我已经用作示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>assembly-example</artifactId>
<groupId>com.greg</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>shaded-jar-1</artifactId>
<name>shaded-jar-1</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.greg.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3) 将构建最终 zip 的分发项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>assembly-example</artifactId>
<groupId>com.greg</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>distribution</artifactId>
<packaging>pom</packaging>
<name>Distribution</name>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/assembly/bin.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4) 一个 bin.xml 来控制 zip 的构建
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<moduleSets>
<moduleSet>
<!-- Enable access to all projects in the current multimodule build! -->
<useAllReactorProjects>true</useAllReactorProjects>
<!-- Now, select which projects to include in this module-set. -->
<includes>
<include>com.greg:shaded-jar-1</include>
<include>com.greg:shaded-jar-2</include>
</includes>
<binaries>
<outputDirectory>modules/maven-assembly-plugin</outputDirectory>
<unpack>false</unpack>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
这会给你一个带有脂肪罐的拉链
jar tvf distribution/target/distribution-1.0-SNAPSHOT-bin.zip
0 Fri Jun 15 10:37:32 BST 2018 modules/
0 Fri Jun 15 10:37:32 BST 2018 modules/maven-assembly-plugin/
501520 Fri Jun 15 10:37:30 BST 2018 modules/maven-assembly-plugin/shaded-jar-1-1.0-SNAPSHOT.jar
501520 Fri Jun 15 10:37:30 BST 2018 modules/maven-assembly-plugin/shaded-jar-2-1.0-SNAPSHOT.jar
检查您的阴影插件是否正常工作,在您的 traget 文件夹中,您应该有一个 fat jar 和一个原始 jar,fat jar 是“默认”工件。
greg@greg-XPS-13-9360:~/work/assembly-example$ ls -l shaded-jar-1/target/
total 520
drwxrwxr-x 3 greg greg 4096 Jun 15 10:37 classes
drwxrwxr-x 3 greg greg 4096 Jun 15 10:37 generated-sources
drwxrwxr-x 3 greg greg 4096 Jun 15 10:37 generated-test-sources
drwxrwxr-x 2 greg greg 4096 Jun 15 10:37 maven-archiver
drwxrwxr-x 3 greg greg 4096 Jun 15 10:37 maven-status
-rw-rw-r-- 1 greg greg 2418 Jun 15 10:37 original-shaded-jar-1-1.0-SNAPSHOT.jar
-rw-rw-r-- 1 greg greg 501520 Jun 15 10:37 shaded-jar-1-1.0-SNAPSHOT.jar
drwxrwxr-x 3 greg greg 4096 Jun 15 10:37 test-classes
推荐阅读
- selenium - Selenium 请求返回错误 400 - 错误请求
- mysql - Mysql:使用来自不同表/列的值更新 json 列
- elasticsearch - Elasticsearch 最新文章查询一组 id
- memory-management - 主存访问时间包括什么?
- python - 使用 Pywinauto 选择 Combobox 项
- javascript - onkeypress 在反应时不能正常工作吗?
- javascript - 将svg图像下载为PNG
- c# - StreamWriter 不写入网络流,但 StreamReader 可以在 C# 中成功读取?
- json - ClickHouse:如何选择一些字段作为 JSON 对象
- centos - 我怎样才能重新包装一个流浪盒子以得到一个更大的分区?