我面临一个非常独特的情况,需要一些建议: 我正在开发一个依赖于同一公司的其他项目的项目,现在我需要对依赖项进行一些修改。 我遇到的问题是来自依赖项的源代码已经丢失,所以我唯一拥有的是存储库中的maven依赖项,以及相应的jar文件。 最重要的是,Jar文件中的一些类使用JiBX解析器创建,映射了一些我没有的XSD文件,结果类是合成的,我发现没有反编译器能够正确处理它们。
所有这一切的唯一好处是我需要更改的类可以被适当地反编译,所以选择以下内容:
由此产生的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>
谢谢!
卡尔斯
答案 0 :(得分:6)
我将如何做到这一点:
这应该让你可以编译.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文件的版本号,我建议使用原始文件的变体。使用相同的groupId
和artifactId
,然后修改版本号。如果原始文件有1.0.2
,则您的新修补文件应以1.0.2-1
发布,以表明它基于1.0.2
来源。如果您需要进行其他更改,请将其发布为1.0.2-2
,依此类推。这样可以很容易地了解修补程序所基于的版本,增加的修补程序编号将为您提供区分版本的方法。