在maven程序集之前替换类文件

Car*_*ala 7 resources jar class package maven

我面临一个非常独特的情况,需要一些建议:我正在开发一个项目,这个项目取决于我同一家公司的其他项目,现在我需要对依赖项进行一些修改.我遇到的问题是来自依赖项的源代码已经丢失,所以我唯一拥有的是存储库中的maven依赖项,以及相应的jar文件.最重要的是,Jar文件中的一些类使用JiBX解析器创建,映射一些我没有的XSD文件,结果类是合成的,我发现没有反编译器能够正确处理它们.

所有这一切的唯一好处是我需要更改的类可以被适当地反编译,所以去了以下内容:

  • 我反编译了整个jar文件,最后得到了一些带有空或错误实现方法的类(JiBx).
  • 我注释了错误方法的主体,以获得存根对象,将所需的更改应用于正确的类并重新编译.
  • 我拿了旧的Jar文件,打开它并用新的类手动替换旧类.

最终的Jar按预期工作.

现在我的问题是:我可以使用Maven完成所有这些吗?

我们的想法是将JiBX类文件作为资源,并将存根等效项保存为源文件,然后让maven:

  • 像往常一样编译所有内容,将所有已编译的类文件放入目标文件夹
  • 从目标文件夹中删除存根类文件,并将其替换为旧的预编译类文件
  • 包装罐子.

你会推荐哪种方法?

UPDATE

我提供了有关依赖项目结构的更多细节:

所有类都在同一个包中:

my.project.domain.JiBX__c_GeneratedObfuscatedClass1.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass2.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass3.java
my.project.domain.CustomizableClass1.java
my.project.domain.CustomizableClass2.java
my.project.domain.CustomizableClass3.java
Run Code Online (Sandbox Code Playgroud)

JiBX类没有作为依赖项正确导入,如果我尝试将任何CustmizableClasses放入项目源中并让JiBX类作为依赖项,编译器会报告缺少的方法.

我也尝试使用Shade插件,但是因为我需要将JiBX类包含到我的源路径中,所以我最终必须从jar依赖包中编译JiBX类并编译CustomizableClasses,但是从jar dep跳过CustomizableClasses并编译JiBX课程.

我觉得它可以工作,但我承认我仍然没有找到这样做的方法.任何线索都会受到欢迎.

更新2(决议)

我在这里解释我是如何使用建议的阴影插件最终管理它的,以防万一其他人需要做同样的事情:

我终于在同一个包中创建了一个反编译类的项目,并将不想被反编译的方法留下了注释掉.

在pom.xml中我添加了以下内容:

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <artifactSet>
                        <includes>
                            <include>${project.groupId}:${project.artifactId}</include>
                            <include>TheDamnedProject:WithoutSources</include>
                        </includes>
                    </artifactSet>
                    <filters>
                        <filter>
                            <artifact>TheDamnedProject:WithoutSources</artifact>
                            <includes>
                                <!-- These classes will be taken directly from dependency JAR -->
                                <include>my/package/ClassWhichCouldNotBeDecompiled1.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled2.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled3.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled4.class</include>
                            </includes>
                        </filter>
                        <filter>
                            <artifact>${project.groupId}:${project.artifactId}</artifact>
                            <excludes>
                                <!-- These classes will be overridden by the ones inside the JAR -->
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled1.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled2.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled3.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled4.class</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

谢谢!

普约尔

nwi*_*ler 6

这是我将如何做到这一点:

  • 为此Jar文件创建一个新的Maven项目,包装类型为jar
  • 将原始Jar文件包含为依赖项
  • 在src文件夹中添加一个反编译的.java文件

这应该让你到了可以编译.java文件的地步,因为jar文件中的其他类是可用的.

您现在有两个Jar文件:一个原始文件,另一个应该包含单个重新编译和更改的类.

将两者都添加到应用程序类路径可能会起作用,但这取决于类路径上的顺序.

如果你想得到一个jar文件,我建议你看看Maven Shade插件(http://maven.apache.org/plugins/maven-shade-plugin/),它可以让你创建一个包含多个来源内容的新Jar文件.它将允许您过滤进入新Jar文件的内容.

Maven Shade插件允许您指定包含每个工件的类.它使用通配符和包含/排除标记,如下所述:http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

创建Jar文件后,我将使用Maven Release插件发布它,然后将该工件包含在下游.这将允许您只在真正需要时更新修补的Jar,它可能不必在每个构建上.但这取决于您的使用模式.

对于新Jar文件的版本号,我建议使用原始文件的变体.使用相同的groupIdartifactId,然后修改版本号.如果原件有1.0.2,则应将新的修补文件作为发布1.0.2-1,以表明它基于1.0.2源.如果您需要进行其他更改,请将其发布为1.0.2-2依此类推.这样可以很容易地了解修补程序所基于的版本,并且增量修补程序编号将为您提供区分版本的方法.