Java 重写web项目中使用的库中的类
我想修补我在war项目中使用的库的java类 我已经用一个具有相同规范名称的新类重写了该类,但在Web应用程序中,仍然首先加载原始类。如何控制类加载顺序 我从这篇文章开始,读到了关于JAR地狱的内容: 并使用了maven的例子: 基本上是一个辅助项目,它依赖于一个新的补丁jar,其中包含重写的类和原始库,以及一个MANIFEST.MF,其中这些库在类路径中的顺序正确。所以其他项目可以使用这个辅助项目 这在独立应用程序中运行良好,但在Web项目中,仍然首先加载原始jarJava 重写web项目中使用的库中的类,java,overriding,classloader,war,Java,Overriding,Classloader,War,我想修补我在war项目中使用的库的java类 我已经用一个具有相同规范名称的新类重写了该类,但在Web应用程序中,仍然首先加载原始类。如何控制类加载顺序 我从这篇文章开始,读到了关于JAR地狱的内容: 并使用了maven的例子: 基本上是一个辅助项目,它依赖于一个新的补丁jar,其中包含重写的类和原始库,以及一个MANIFEST.MF,其中这些库在类路径中的顺序正确。所以其他项目可以使用这个辅助项目 这在独立应用程序中运行良好,但在Web项目中,仍然首先加载原始jar 有什么帮助吗?一个糟糕
有什么帮助吗?一个糟糕的解决方案是从包含您不喜欢加载的版本的jar中删除该类 另一个解决方案是对类路径进行重新排序,使您的版本位于旧版本之前。发件人: 规格订单 指定多个类路径项的顺序是 重要的。Java解释器将在 目录在类路径变量中的显示顺序。在里面 在上面的示例中,Java解释器将首先查找所需的 类在目录C:\java\MyClasses中。除非它找不到一个 解释器将在该目录中使用正确的名称初始化 在C:\java\OtherClasses目录中 请注意,这两种解决方案都非常肮脏,未来对代码的修改可能会破坏您的功能(例如更改类路径或更新jar) 最好的方法是以下方法之一:
- 扩展类并仅使用新类
- 在新类中实现同一接口并使用它
- 扩展类并仅使用新类
- 在新类中实现同一接口并使用它
- 一个糟糕的解决方案是从包含您不喜欢加载的版本的jar中删除该类
另一个解决方案是对类路径进行重新排序,使您的版本位于旧版本之前。发件人:
规格订单
指定多个类路径项的顺序是
重要的。Java解释器将在
目录在类路径变量中的显示顺序。在里面
在上面的示例中,Java解释器将首先查找所需的
类在目录C:\java\MyClasses中。除非它找不到一个
解释器将在该目录中使用正确的名称初始化
在C:\java\OtherClasses目录中
请注意,这两种解决方案都非常肮脏,未来对代码的修改可能会破坏您的功能(例如更改类路径或更新jar)
最好的方法是以下方法之一:
或者,你可以尝试在你的web应用程序中启动“启动”,这是一个先例。然后确定得到的是什么类。如果控制应用程序客户端,可以尝试在运行时使用jar: 请参见此以查看加载 如果您还想卸载:
或者,你可以尝试在你的web应用程序中启动“启动”,这是一个先例。然后你就可以确定你上的是什么课了。我也遇到了同样的问题,下面是我为让它工作所做的。 我的项目包括一个“ThatProject”库,其中包含一个ServiceFactory.java类,该类导致了一个bug
<dependencies>
<dependency>
<groupId>com.example.ThatGroup</groupId>
<artifactId>ThatProject</artifactId>
<version>${ThatProject.version}</version>
</dependency>
</dependencies>
com.example.ThatGroup
那个项目
${ThatProject.version}
在我自己的项目中,我创建了一个与“ThatProject”相同的类(路径必须匹配)。
→ src\main\java\com\example\ThatGroup\ThatProject\ServiceFactory.java
在我的pom.xml中,我使用了maven shade插件,如下所示。
请注意,我是如何将原始ServiceFactory.java从“ThatProject”库中排除的
maven编译器插件
${maven编译器plugin.version}
${java.version}
${java.version}
maven阴影插件
2.2
阴凉处
阴凉处
包裹
假的
ThatGroup:ThatClient
com/example/ThatGroup/ThatProject/ServiceFactory.class
就这样,我终于成功了。在我的例子中,我使用pom.xml配置(包括我的跟踪版本ServiceFactory.java)包含了我项目的所有文件。
如前所述,原始ServiceFactory.java在maven构建期间被排除
希望这有帮助 我遇到了完全相同的问题,下面是我为使其发挥作用所做的工作。 我的项目包括一个“ThatProject”库,其中包含一个ServiceFactory.java类,该类导致了一个bug
<dependencies>
<dependency>
<groupId>com.example.ThatGroup</groupId>
<artifactId>ThatProject</artifactId>
<version>${ThatProject.version}</version>
</dependency>
</dependencies>
com.example.ThatGroup
那个项目
${ThatProject.version}
在我自己的项目中,我创建了一个与“ThatProject”相同的类(路径必须匹配)。
→ src\main\java\com\example\ThatGroup\ThatProject\ServiceFactory.java
在我的pom.xml中,我使用了maven shade插件,如下所示。
请注意,我是如何将原始ServiceFactory.java从“ThatProject”库中排除的
maven编译器插件
${maven编译器plugin.version}
${java.version}
${java.version}