外部资源中的Maven类修补

时间:2018-07-15 16:23:23

标签: java maven overwrite maven-assembly-plugin maven-shade-plugin

核心主题 -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>

因此,修改模块使用与依赖项中的类相同的包结构。

主要问题 如果应用程序在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文件的信息,但是如何做到这一点,并且没有其他解决方案,而无需指定所有覆盖的文件?

下载完整的外部依赖项,修改文件并将更改上传到存储库并链接该文件也是一种解决方案(正如我在某些主题中发现的那样)。

0 个答案:

没有答案