Java 外部资源中的maven类修补

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

核心主题 -linux和windows上的Maven表现完全不同 -外部JAR中特定于修补程序的类文件

形势 我有一个具有以下结构的多模块java项目

  • 核心(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>