从战争中加载earpers服务(servlet 3.0)的呼吸中的类时,weblogic的行为不一致



我在WebLogic 12c(12.2.1.0.0(中部署EAR包的问题非常奇怪。首先,我们需要使用一个非常旧的库,但是该库在一堂课上有问题,因此我们将同一班级重写在另一个罐子中,然后将其放在aggy的一个类别中class Loading Order订单,以便在运行时我们的版本更早加载,并且所有版本都按预期工作。不幸的是,根据Oracle的文档,在部署简单战争时,WebLogic在usiant.mf文件中的类别条目中无法正常工作。为了使其正常工作,我需要以以下方式重新包装我的应用程序:

耳朵    libz    meta-inf    WS-WEBAPP.WAR

我的" libz"文件夹包含所有依赖项,包括旧的罐子和修补程序。ws-webapp中的清单.mf定义了我的类路径,包括前缀" libz",似乎可以正常工作。

当我尝试使用注释定义网络服务时,会发生怪异。假设我有一个名为foo的类,那是在旧书库中, and 是我需要修补的类之一。

以下代码效果很好,代码编译,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();
    }
}

我什至无法部署耳朵,因为Weblogic返回一个例外:

Caused by: java.lang.ClassNotFoundException: com.legacy.Foo 

我试图在WebLogic部署描述符中使用" Peave-Web-Inf-classes",但是这种方法不起作用,因为我需要为上述原因保留类上传顺序,而我无法迫使博客使用战争的表现中。任何帮助都将不胜感激。

非常感谢。

最后,我找到了解决问题的解决方案。奇怪的行为由jaxws给出。由于它是本机Java库,因此WebLogic将其加载到系统类加载程序中。当我的对象在方法中声明时,它们是自然加载的广告运行时。相反,方法的签名是在部署时间加载的,因此,由于我的库是在战争清单中定义的,因此尚未"看到",因此ClassNotFoundException。

另一个错误是定义ear文件中的自定义库文件夹:

EAR
+ libz
+ META-INF
+ ws-webapp.war

长话短说:我将 libz 重命名为 lib 和Weblogic和Weblogic在"标准方式"中加载耳朵,这正在寻找众所周知的文件夹中的应用程序库。然后我完成如下:

  1. 我按照Oracle文档中所述设置战争项目,以便在战争附近的LIB文件夹中查找库
  2. 我配置了maven(*(将所有依赖项添加到estest.mf.mf,但 not 在战争的Web-Inf/lib中
  3. 最后,我在weblogic.xml部署描述符中添加了通过" preaepe-web-inf-classes "的元素来加载战争库的指令。

部署描述符中的优先web-inf类对于指示我们要使用subtest.mf中描述的类别路径条目的weblogic很重要要告诉Maven在清单中包含库,而不是在Web-Inf/lib中,只需添加

<optional>true</optional> 

每个依赖性。

相关内容

  • 没有找到相关文章

最新更新