【发布时间】:2018-02-15 13:26:42
【问题描述】:
我在 Weblogic 12c (12.2.1.0.0) 中部署 EAR 包时遇到了一个非常奇怪的问题。 首先,我们需要使用一个非常古老且特定的库,但是这个库在一个类上存在问题,所以我们在不同的 jar 中重写了同一个类,并将它放在类路径中,就在 buggy 强制类加载顺序,以便在运行时更早加载我们的版本,并且一切都按预期工作。 不幸的是,根据the Oracle's documentation,在部署简单的WAR 时,Weblogic 无法使用MANIFEST.MF 文件中的Class-Path 条目按预期工作。 为了使它工作,我需要通过以下方式重新打包我的应用程序:
耳朵 + 库 + 元信息 + ws-webapp.war我的“libz”文件夹包含所有依赖项,包括遗留 jar 和修补程序。 ws-webapp 中的 MANIFEST.MF 定义了我的 Class-Path,包括前缀“libz”,它似乎工作正常。
当我尝试使用注释定义 Web 服务时,就会发生奇怪的事情。 假设我有一个名为 Foo 的类,它在旧库中,并且是我需要修补的类之一。
以下代码运行良好,代码编译,EAR 部署,web 服务运行,结果符合预期,即我收到了修补类中实现的 toString():
@WebService(serviceName = "MyWebService")
public class MyWebService {
@WebMethod(operationName = "Foo")
public void foo() {
System.out.println(new Foo());
}
}
另一方面,如果我只是创建一个返回 Foo 对象的方法,如下例所示:
@WebService(serviceName = "MyWebService")
public class MyWebService {
@WebMethod(operationName = "Foo")
public void foo() {
System.out.println(getFoo());
}
private Foo getFoo() {
return new Foo();
}
}
我什至无法部署 EAR,因为 Weblogic 返回异常:
Caused by: java.lang.ClassNotFoundException: com.legacy.Foo
我尝试在 weblogic 部署描述符中使用“prefer-web-inf-classes”,但这种方法不起作用,因为由于上述原因我需要保持类加载顺序,但我不能强制 weblogic 使用战争清单中的那个。 任何帮助将不胜感激。
非常感谢。
【问题讨论】:
标签: java web-services classloader weblogic12c