核心主题 -Linux和Windows上的Maven行为完全不同 -在外部jar中修补特定的类文件
情况 我有一个具有以下结构的多模块Java项目。
目标是从如下定义的外部依赖项覆盖某些类文件:
<dependency>
<groupId>org.knowm.xchange</groupId>
<artifactId>xchange-core</artifactId>
<version>4.3.9-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
因此,修改模块使用与依赖项中的类相同的包结构。
主要问题 如果应用程序在Eclipse中执行,或者在Windows上创建了可运行的jar文件,则应按原样使用修改后的文件。另一方面,如果它是在Linux上构建的,则使用外部存储库中的旧文件。
调查 首先,我在2.2-beta-5版本中使用了maven-assembly-plugin,这是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>
**** services.pom ****
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>feedRunner</id>
<configuration>
<finalName>feedRunner</finalName>
<archive>
<manifest>
<mainClass>Priv.Services.Constructor.feedRunner</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
因此,我尝试使用3.1.1版中的maven-shade-plugin和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>
**** 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>
为什么linux的行为如此不同,我如何修补这些文件,以便可以在两个操作系统上都创建一个可运行的jar文件?我读了一些关于不使用阴影的aubout文件的信息,但是如何做到这一点,并且没有其他解决方案,而无需指定所有覆盖的文件?
下载完整的外部依赖项,修改文件并将更改上传到存储库并链接该文件也是一种解决方案(正如我在某些主题中发现的那样)。