Car*_*ala 7 resources jar class package maven
我面临一个非常独特的情况,需要一些建议:我正在开发一个项目,这个项目取决于我同一家公司的其他项目,现在我需要对依赖项进行一些修改.我遇到的问题是来自依赖项的源代码已经丢失,所以我唯一拥有的是存储库中的maven依赖项,以及相应的jar文件.最重要的是,Jar文件中的一些类使用JiBX解析器创建,映射一些我没有的XSD文件,结果类是合成的,我发现没有反编译器能够正确处理它们.
所有这一切的唯一好处是我需要更改的类可以被适当地反编译,所以去了以下内容:
最终的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)
谢谢!
普约尔
这是我将如何做到这一点:
这应该让你到了可以编译.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依此类推.这样可以很容易地了解修补程序所基于的版本,并且增量修补程序编号将为您提供区分版本的方法.