覆盖Web项目中使用的库中的类

ant*_*ar9 1 java overriding war classloader

我想修补我在 war 项目中使用的库的 java 类。

我已使用具有相同规范名称的新类覆盖了该类,但在 Web 应用程序中,仍首先加载原始类。如何控制类加载顺序?

我从这篇文章开始,阅读了 JAR Hell: Override class in java

并使用了这里找到的maven示例: http://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

基本上是一个辅助项目,依赖于带有覆盖类和原始库的新修补 jar,以及 MANIFEST.MF 以及这些库在类路径中的正确顺序。所以其他项目可以使用这个辅助项目。

这在独立应用程序中工作得很好,但在 Web 项目中,原始 jar 仍然首先加载。

有什么帮助吗?

Tra*_*bes 5

我遇到了完全相同的问题,这就是我为使其工作而所做的事情。\n我的项目包括一个“ThatProject”库,其中包含导致错误的 ServiceFactory.java 类。

\n\n
<dependencies>\n    <dependency>\n        <groupId>com.example.ThatGroup</groupId>\n        <artifactId>ThatProject</artifactId>\n        <version>${ThatProject.version}</version>\n    </dependency>\n</dependencies>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我自己的项目中,我创建了一个相同的类来隐藏“ThatProject”之一(路径必须匹配)。\n\xe2\x86\x92 src\\main\\java\\com\\example\\ThatGroup\\ ThatProject\\ServiceFactory.java

\n\n

在我的 pom.xml 中,我使用了 maven-shade-plugin 插件,如下所示。\n请注意我如何从“ThatProject”库中排除原始 ServiceFactory.java。

\n\n
<build>\n    <plugins>\n        <plugin>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <version>${maven-compiler-plugin.version}</version>\n            <configuration>\n                <source>${java.version}</source>\n                <target>${java.version}</target>\n            </configuration>\n        </plugin>\n        <!-- Include all dependencies in JAR -->\n        <plugin>\n          <artifactId>maven-shade-plugin</artifactId>\n          <version>2.2</version>\n          <executions>\n            <execution>\n              <id>shade</id>\n              <goals>\n                <goal>shade</goal>\n              </goals>\n              <phase>package</phase>\n              <configuration>\n                <createDependencyReducedPom>false</createDependencyReducedPom>\n                <filters>\n                  <filter>\n                    <artifact>com.example.ThatGroup:ThatClient</artifact>\n                    <excludes>\n                      <exclude>com/example/ThatGroup/ThatProject/ServiceFactory.class</exclude>\n                    </excludes>\n                  </filter>\n                </filters>\n              </configuration>\n            </execution>\n          </executions>\n        </plugin>\n    </plugins>\n</build>\n
Run Code Online (Sandbox Code Playgroud)\n\n

就是这样,它终于对我有用了。就我而言,我使用 pom.xml 的配置包含了项目的所有文件(包括我的 ServiceFactory.java 的影子版本)。\n如前所述,原始 ServiceFactory.java 在 Maven 构建期间被排除。

\n\n

希望这可以帮助!

\n