如何在Oracle Application Server中的Web应用程序中使用jaxb 2

时间:2009-11-16 18:45:55

标签: java oc4j jaxb2

我有一个运行Jaxb 2.1.12的应用程序。我正在运行JDK 1.5和OC4J 10.1.3.4.0。当我尝试使用我的应用程序使用Jaxb的部分时,我收到以下错误:

Unable to locate jaxb.properties for package

我把它缩小到了OC4J附带的xml.jar。它包含Jaxb 1.0类。我可以通过在orion-application.xml文件中添加以下内容来修复此错误:

<imported-shared-libraries>
    <remove-inherited name="oracle.xml"/>
</imported-shared-libraries>

问题是我使用admin_client.jar实用程序将WAR文件部署到OC4J。我没有EAR来放入orion-application.xml文件,因此我决定尝试将orion-web.xml文件添加到WAR的WEB-INF目录并将search-local-classes-first属性设置为true :

<?xml version="1.0"?>    
<orion-web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-web-10_0.xsd"  deployment-version="10.1.3.4.0"
 jsp-cache-directory="./persistence"
 jsp-cache-tlds="standard"
 simple-jsp-mapping="false"
 temporary-directory="./temp"
 schema-major-version="10" schema-minor-version="0" >

  <web-app-class-loader search-local-classes-first="true"  />

 <web-app>
 </web-app>
</orion-web-app>

这会导致应用程序根本不进行部署。我收到一条错误消息,指出无法解析Spring配置文件。我想首先使用search-local-classes。我该如何使用这个属性?还有一种方法可以使用WAR文件部署orion-application.xml文件吗?

09/11/16 13:26:01 WARNING: DeployerRunnable.run Unexpected exception parsing XML document from Servl
etContext resource [/WEB-INF/applicationContext-acegi-security.xml]; nested exception is java.lang.C
lassCastException: oracle.xml.jaxp.JXDocumentBuilderFactoryoracle.oc4j.admin.internal.DeployerExcept
ion: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/applicationCon
text-acegi-security.xml]; nested exception is java.lang.ClassCastException: oracle.xml.jaxp.JXDocume
ntBuilderFactory
        at oracle.oc4j.admin.internal.DeployerBase.execute(DeployerBase.java:126)
        at oracle.oc4j.admin.jmx.server.mbeans.deploy.OC4JDeployerRunnable.doRun(OC4JDeployerRunnabl
e.java:52)
        at oracle.oc4j.admin.jmx.server.mbeans.deploy.DeployerRunnable.run(DeployerRunnable.java:81)

        at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledE
xecutor.java:303)
        at java.lang.Thread.run(Thread.java:595)

注意:我没有在Java 1.6中遇到此错误,我相信这是因为1.6与Jaxb 2打包在一起。

2 个答案:

答案 0 :(得分:1)

在“search-local-classes-first”的文档中,我看到以下行:

根据servlet规范,search-local-classes-first功能不能用于加载java。或javax。* packages中的类。*

因为JAXB2包含在JDK 1.6中并且现在位于javax.*之下,所以appserver可能会忽略类/库,即使它存在于WEB-INF / lib目录中。尝试将JAXB jar放在$ JRE_HOME / lib目录中。如果它被拾取,那么您可以尝试修改appserver的启动脚本,以将JAXB jar包含在原始类路径中。

解决方案有点破解:)。这是一个链接,其中包含为Apache CXF执行相同操作的步骤。

Replacing JAXB with JAXB2.0 in OC4j

答案 1 :(得分:1)

如果创建一个ear文件解决了这个问题,我建议你这样做。此外,当您部署war文件时,容器会为您创建一个耳朵。检查oc4j的安装目录的应用程序目录中的ear文件。