2015-11-20 22 views
0

我想修补我在战争项目中使用的库的Java类。重写Web项目中使用的库中的类

我已经用一个具有相同规范名称的新类覆盖了类,但是在Web应用程序中,原始类仍然是首先加载的。我怎样才能控制课程加载顺序?

我从这篇文章开始,并readed约JAR地狱: Override class in java

,并用于发现这里的行家例如: http://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

基本上是一个附配的项目依赖于一个新的补丁的罐子与覆盖类和原始库一起使用MANIFEST.MF,这些库在类路径中以正确的顺序排列。所以其他项目可以使用这个辅助项目。

这在独立应用程序中正常工作,但在Web项目中原始的jar仍然是首先加载的。

任何帮助?

回答

1

一个肮脏的解决方案是从包含您不想加载的版本的jar中删除该类。

另一种解决方案是对类路径重新排序,以便您的版本在旧版本之前。从java documentation

规格订购

在其中可以指定多个类路径项的顺序很重要 。 Java解释器将按照它们出现在类路径变量中的顺序在 目录中查找类。在上面的示例 中,Java解释器将首先在目录C:\ java \ MyClasses中查找所需的 类。只有当它在该目录中找不到具有正确名称的 类时,解释器才会在C:\ java \ OtherClasses目录中查找 。

请注意,这两种解决方案都非常肮脏,未来对代码的修改可能会破坏您的功能(例如更改类路径或更新jar)。

的最佳方式将是下列之一:

  • 扩展的类,并且只使用新的类
  • 实现相同的接口在一个新的类,并使用它
+0

那么,这是一个实用工具类,用于不受我控制的外部jar,我无法扩展该类。 我已经直接将类替换为jar,但正如你所说这不是很正确。 类路径重新排序是在web项目中正好不起作用的东西。 – antgar9

0

如果您控制应用程序客户端,您可以尝试在运行时使用jar进行游戏:

请参阅此处以加载 How to load a jar file at runtime

如果您还想卸载: Dynamic loading and unloading of jar

或者,你可以尝试在你的web应用程序启动,在“启动”,先例伎俩。然后你确定你得到了什么课程。

0

我有完全相同的问题,这是我做的工作。 我的项目包含一个“ThatProject”库,其中包含一个导致错误的ServiceFactory.java类。

<dependencies> 
    <dependency> 
     <groupId>com.example.ThatGroup</groupId> 
     <artifactId>ThatProject</artifactId> 
     <version>${ThatProject.version}</version> 
    </dependency> 
</dependencies> 

在我自己的项目,我创建了一个相同的类影子“ThatProject”(该路径必须匹配)之一。 →src \ main \ java \ com \ example \ ThatGroup \ ThatProject \ ServiceFactory.java

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

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

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

希望这会有所帮助!

相关问题