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

时间:2013-02-12 10:45:43

标签: class maven jar resources package

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

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

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

由此产生的Jar按预期工作。

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

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

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

您会推荐哪种方式?

更新

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

所有类都在同一个包中:

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

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

我也尝试过使用Shade插件,但由于我需要将JiBX类包含到我的源代码路径中,我最终必须从jar依赖包中编译JiBX类并编译CustomizableClasses,但是从jar中跳过CustomizableClasses dep和编译的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>

谢谢!

卡尔斯

1 个答案:

答案 0 :(得分: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,依此类推。这样可以很容易地了解修补程序所基于的版本,增加的修补程序编号将为您提供区分版本的方法。