Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写web项目中使用的库中的类_Java_Overriding_Classloader_War - Fatal编程技术网

Java 重写web项目中使用的库中的类

Java 重写web项目中使用的库中的类,java,overriding,classloader,war,Java,Overriding,Classloader,War,我想修补我在war项目中使用的库的java类 我已经用一个具有相同规范名称的新类重写了该类,但在Web应用程序中,仍然首先加载原始类。如何控制类加载顺序 我从这篇文章开始,读到了关于JAR地狱的内容: 并使用了maven的例子: 基本上是一个辅助项目,它依赖于一个新的补丁jar,其中包含重写的类和原始库,以及一个MANIFEST.MF,其中这些库在类路径中的顺序正确。所以其他项目可以使用这个辅助项目 这在独立应用程序中运行良好,但在Web项目中,仍然首先加载原始jar 有什么帮助吗?一个糟糕

我想修补我在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)

      最好的方法是以下方法之一:

      • 扩展类并仅使用新类
      • 在新类中实现同一接口并使用它

      如果您控制应用程序客户端,您可以尝试在运行时使用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}