Java 外部资源中的maven类修补
核心主题 -linux和windows上的Maven表现完全不同 -外部JAR中特定于修补程序的类文件 形势 我有一个具有以下结构的多模块java项目Java 外部资源中的maven类修补,java,maven,overwrite,maven-assembly-plugin,maven-shade-plugin,Java,Maven,Overwrite,Maven Assembly Plugin,Maven Shade Plugin,核心主题 -linux和windows上的Maven表现完全不同 -外部JAR中特定于修补程序的类文件 形势 我有一个具有以下结构的多模块java项目 核心(pom链接外部依赖项) 普通的 服务(使用修补文件的主类) 修改(包含修补的类文件) 目标是从定义如下的外部依赖项覆盖某些类文件: <dependency> <groupId>org.knowm.xchange</groupId> <artifactI
- 核心(pom链接外部依赖项)
- 普通的
- 服务(使用修补文件的主类)
- 修改(包含修补的类文件)
<dependency>
<groupId>org.knowm.xchange</groupId>
<artifactId>xchange-core</artifactId>
<version>4.3.9-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
org.knowm.xchange
交换核心
4.3.9-快照
罐子
编译
因此,修改模块使用与依赖项中的类相同的包结构
主要问题
如果应用程序在eclipse中执行,或者在windows上创建了一个可运行的jar文件,那么修改后的文件将按原样使用。另一方面,如果它是在Linux上构建的,则使用外部存储库中的旧文件
**** core.pom ****
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputDirectory>${project.parent.basedir}/tmp</outputDirectory>
<failOnError>false</failOnError>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<outputDirectory>${project.parent.basedir}/tmp</outputDirectory>
</configuration>
</plugin>
</plugins>
调查
首先,我在版本2.2-beta-5中使用了maven汇编插件,这是windows与maven 3.3.9的默认版本。使用此配置,jar文件包含修改过的文件。如果使用较新版本的汇编插件,它将不再工作。在Linux上,它从不工作,它总是使用未修补的文件
**** core.pom ****
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
**core.pom****
org.apache.maven.plugins
maven汇编插件
3.1.0
假的
带有依赖项的jar
真的
**services.pom****
maven汇编插件
喂料槽
喂料槽
Priv.Services.Constructor.feedRunner
因此,我尝试在版本3.1.1中使用maven shade插件,在版本3.3.9中使用maven。在Windows上它再次工作,但在linux上使用旧文件
**** core.pom ****
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputDirectory>${project.parent.basedir}/tmp</outputDirectory>
<failOnError>false</failOnError>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<outputDirectory>${project.parent.basedir}/tmp</outputDirectory>
</configuration>
</plugin>
</plugins>
**core.pom****
org.apache.maven.plugins
maven阴影插件
3.1.1
包裹
阴凉处
${project.parent.basedir}/tmp
假的
org.apache.maven.plugins
maven jar插件
2.4
${project.parent.basedir}/tmp
**Services.pom****
org.apache.maven.plugins
maven阴影插件
3.1.1
喂料槽
包裹
阴凉处
${project.parent.basedir}/jars/feedRunner.jar
${project.parent.basedir}/tmp
Priv.Services.Constructor.feedRunner
${maven.compile.source}
${maven.compile.target}
为什么linux的行为如此不同?我如何修补这些文件,以便在两个操作系统上都可以创建一个可运行的jar文件?我读过一些关于文件不包括使用阴影的内容,但如何做到这一点?如果不指定所有覆盖的文件,是否没有其他解决方案
下载完整的外部依赖项、修改文件并将更改上载到存储库并链接该文件也是没有解决方案的(正如我在一些主题中发现的那样)。您为什么要配置如此多的插件部分,如outputDirectory?您是否在github/bitbucket等上有该项目可用?是的。有必要在所需位置生成JAR,而不在其中生成任何附加文件。只是因为输出结构中的美观原因,而不是现在。我必须检查一下我是否能给出一个最小的例子。
**** Services.pom ****
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>feedRunner</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>${project.parent.basedir}/jars/feedRunner.jar</outputFile>
<outputDirectory>${project.parent.basedir}/tmp</outputDirectory>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>Priv.Services.Constructor.feedRunner</Main-Class>
<X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>
<X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>