2011-12-28 157 views
2

我已经问过一个相关的问题 - 但这不完全相同。如果问题有点不同,我早先被告知不要在同一主题中提出其他问题。所以我发布这个新问题。请让我知道如果我不应该。Classloader Filtering

我有一个网络应用程序(战争文件)。 Jar与apache-commons-lang相关联,与其他jar文件一起被添加到WEB-INF库中。然而,与apache-commons-lang有关的旧版本的jar也存在于系统库中,并且在系统classpath中部署jar文件时优先,并且我得到“classnotfound”错误。必须为在WEB-INF中指定的类指定prefer-web-inf-classes,使其优先于System Classloader中的类。不过,我只希望这个特定的jar优先于系统类加载器。当我发布类似的问题时,建议我在weblogic中使用“筛选类加载器”。当我有耳朵时,该解决方案效果很好。但是我不能在war文件中添加weblogic-application.xml,我无法使用这个classloader过滤概念。有出路吗?谢谢。

+0

如果无法通过配置来完成,是否有可能编写一些代码来实现这一点?谢谢! – 2011-12-29 09:06:04

回答

1

我对WebLogic不是很熟悉,但是如果您知道如何使用新的jar,并且进入该代码就像实例化一个类并执行一种启动方法一样简单,那么您可能会失去定制类加载器? 请参阅http://tshrestha.blogspot.com/2011/12/using-custom-classloader.html

但我承认,某些WebLogic专家知道如何通过WebLogic自身的某些配置来实现此目的。

0

我的一位同事指出,在weblogic.xml中指定相关的包可以解决问题。但要尝试一下。

<wls:prefer-application-packages> 
     <wls:package-name>javax.faces.*</wls:package-name> 
     <wls:package-name>com.sun.faces.*</wls:package-name> 
     <wls:package-name>javax.xml.*</wls:package-name> 
     <wls:package-name>org.apache.xerces.*</wls:package-name> 
     <wls:package-name>antlr.*</wls:package-name> 
     <wls:package-name>org.apache.log4j.*</wls:package-name> 
     <wls:package-name>org.apache.commons.*</wls:package-name> 
    </wls:prefer-application-packages> 
0

我没有weblogic的大师,但我看到两种方式(有没有试过,但只是猜测)

1)只保留 '喜欢-WEB-INF类' 需要的jar在WEB-INF并将其余的移动到不同的位置并将它们指向MANIFEST.MF的战争

2)将空白耳朵中的战争捆绑起来,并指定耳朵的MANIFEST.MF中的所有罐子并在weblogic-application中指定首选项类.xml。这个想法是使同一个应用程序的战争和耳朵的一部分,使网络应用程序可以使用相同的类加载器(而不是使用'prefer-web-inf-classes')

编辑: 对于第一点我有验证了weblogic忽略了war文件的Manifest文件。所以第一个溶胶不起作用。关于第二个解决方案,如果耳中没有ejbs,weblogic会盲目忽略耳朵的清单。因此,您必须将WAR的库移到APP-INF \ lib或简单的lib目录,并在weblogic-application.xml中指定首选项包apache-commons-lang 反正不认为这是一个efficeint解决方案(esp when你不想为了它而创造一个耳朵)

0

维基,我有同样的问题,因为你的。对我而言,解决方案是在域下创建一个/lib文件夹(其中一些位于weblogic文档中),添加您需要覆盖的任何第三方JAR,然后在PRE_CLASSPATH变量中指定该库startWeblogic.cmd文件。

在我的情况下,weblogic有一个旧版本的commons-lang,这是导致冲突。 因为我没有EAR部署,所以weblogic-application.xml解决方案是不行的。 当我将下列内容添加到我的pre_classpath -
set PRE_CLASSPATH =%PRE_CLASSPATH%;%DOMAIN_HOME%/ lib/commons-lang-2.5.jar;

我的问题已解决。

+1

感谢Daranha,这是我们使用的解决方案之一。但是我们不想在pre_classpath变量中定义它,因为它适用于显示在weblogic应用服务器中的所有应用程序。 – 2012-05-26 20:14:22