Can't find spring-context Schema from WildFly 10 Module - java

I've been searching and fighting this all day and nothing I have found has been able to resolve this issue. I am in the progress of attempting to migrate a spring-based application to WildFly 10 (from a legacy JBoss application server) and am having issues when deploying.
For this application, I have my application (MyApplication.war) and 2 modules, Spring 3.1.2 and MyCustomJar.jar. The custom JAR contains spring XML configuration files (and is what appears to be blowing up on WildFly).
The WAR file deploys, and the spring container gets initialized. However once it starts to try and process bean definitions from mycustomjar.jar!myspring-app.xml it errors out because it cannot find the spring context schema. The stack trace from wildfly and my module + jboss-deployment-structure are included. Any ideas to try would be appreciated. I have done about every variation of import/export from the spring module that I could find online today with absolutely no effect.
2017-03-02 14:58:08,282 INFO [org.springframework.web.context.support.XmlWebApplicationContext] (ServerService Thread Pool -- 62) Refreshing Root WebApplicationContext: startup date [Thu Mar 02 14:58:08 EST 2017]; root of context hierarchy
2017-03-02 14:58:08,317 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (ServerService Thread Pool -- 62) Loading XML bean definitions from URL [jar:file:/c:/data/apps/wildfly-10.1.0.Final/modules/mycustomjar/mycustomjar.jar!/myspring-context.xml]
2017-03-02 14:58:08,518 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (ServerService Thread Pool -- 62) Loading XML bean definitions from class path resource [myspring-app.xml]
2017-03-02 14:58:08,575 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (ServerService Thread Pool -- 62) Loading XML bean definitions from class path resource [myspring-services.xml]
2017-03-02 14:58:08,676 ERROR [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 62) Context initialization failed: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:myspring-services.xml]
Offending resource: URL [jar:file:/c:/data/apps/wildfly-10.1.0.Final/modules/mycustomjar/mycustomjar.jar!/myspring-context.xml]; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: class path resource [myspring-services.xml]
org.springframework.spring
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="org.springframework.spring" slot="3.1.2">
<resources>
<resource-root path="org.springframework.aop-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.asm-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.aspects-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.beans-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.context-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.context.support-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.core-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.expression-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.instrument-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.instrument.tomcat-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.jdbc-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.jms-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.orm-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.oxm-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.test-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.transaction-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.web-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.web.portlet-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.web.servlet-3.1.2.RELEASE.jar" />
<resource-root path="org.springframework.web.struts-3.1.2.RELEASE.jar" />
</resources>
<dependencies>
<module name="javax.api" export="true" />
<module name="javax.servlet.api" />
<module name="org.apache.commons.logging" />
<module name="org.jboss.vfs" />
<module name="org.jboss.msc" />
</dependencies>
</module>
MyCustomJar.jar
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="mycustomjar">
<resources>
<resource-root path="mycustomjar.jar" />
</resources>
<dependencies>
</dependencies>
</module>
MyApplication.war jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<module name="javax.servlet.api" />
<module name="org.springframework.spring" meta-inf="export" export="true" />
<module name="mycustomjar" />
</dependencies>
</deployment>
</jboss-deployment-structure>
EDIT
I started testing around with different spring versions, and upgrading to 3.2.14 I was able to get it running without any issues using the above configuration. Are the schema files located in a different spot in 3.1.2? It has to be something with those specific versions because a simple upgrade fixed everything

Related

Defining 3rd-party library in Wildfly as Module without including its dependencies

I am developing a web application for Wildfly 9 using a quite standard stack (Java 8, JAX-RS, Hibernate etc).
Now I have to use a third-party library, which has various dependencies to libraries version of Log4j etc. Since I don't want to analyze if these dependencies are compatible with the libraries in the current web-app, I thought it would be a good idea to define a Module in Wildfly. Something like
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="foo.md">
<resources>
<resource-root path="foo-1.0.jar" />
<resource-root path="log4j-1.2.12" />
<resource-root path="concurrent-1.0.jar" />
<!-- etc -->
</resources>
</module>
Then I could include the module using jboss-deployment-structure.xml
<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<module name="foo.md" >
<imports>
<include path="foo" />
<exclude path="bar" />
</imports>
</module>
</dependencies>
</deployment>
This way, I could isolate the dependencies of the third-party library and don't have to analyze if they are compatible with my app without using (imo heavy-weight) approaches like OSGi which would require more changes to the app or waiting for Jigsaw.
Is this a valid approach?

Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.BCException in JBOSS AS

Currently, my application server does not start because it reports class not found when my dependencies are already exposed in the maven and bundled together in my ear.
Basically how do you get JBOSS 7.1 to work with AspectJ smoothly.
Maybe I need to add a module? An AspectJ module?
Any advice will be great.
More Details about the error
01:18:41,515 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/]] (MSC service thread 1-7) Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener: java.lang.NoClassDefFoundError: org/aspectj/weaver/BCException
at java.lang.Class.getDeclaredMethods0(Native Method) [rt.jar:1.7.0_45]
at java.lang.Class.privateGetDeclaredMethods(Class.java:2531) [rt.jar:1.7.0_45]
at java.lang.Class.getDeclaredMethods(Class.java:1855) [rt.jar:1.7.0_45]
at org.springframework.core.type.StandardAnnotationMetadata.hasAnnotatedMethods(StandardAnnotationMetadata.java:159) [spring-core-3.1.1.RELEASE.jar:3.1.1.RELEASE]
Since my app server is loaded with a predefined list of modules from Spring. I had to override it with my own.
An example is shown below.
<module xmlns="urn:jboss:module:1.1" name="org.springframework.spring">
<resources>
<resource-root path="spring-aop-3.1.1.RELEASE.jar"/>
<resource-root path="spring-asm-3.1.1.RELEASE.jar"/>
<resource-root path="spring-beans-3.1.1.RELEASE.jar"/>
<resource-root path="spring-context-3.1.1.RELEASE.jar"/>
<resource-root path="spring-core-3.1.1.RELEASE.jar"/>
<resource-root path="spring-expression-3.1.1.RELEASE.jar"/>
<resource-root path="spring-web-3.1.1.RELEASE.jar"/>
<resource-root path="aopalliance-1.0.jar"/> <!-- added -->
<resource-root path="cglib-nodep-2.2.2.jar"/> <!-- added -->
<resource-root path="aspectjrt-1.6.11.jar"/> <!-- added -->
<resource-root path="aspectjweaver-1.6.11.jar"/> <!-- added -->
</resources>
<dependencies>
...
</dependencies>
</module>

How to configure wildfly to use EclipseLink?

i have installed wildfly 8.1 and because i have already a project configured to use EclipseLink, i have tried to configure wildfly to use it.
However, it always gives the same error :
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:166) [wildfly-server-8.1.0.Final.jar:8.1.0.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_25]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_25]
at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]
Caused by: javax.persistence.PersistenceException: JBAS011466: PersistenceProvider '
org.eclipse.persistence.jpa.PersistenceProvider
' not found
at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.lookupProvider(PersistenceUnitServiceHandler.java:990)
at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.addPuService(PersistenceUnitServiceHandler.java:258)
at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.handleWarDeployment(PersistenceUnitServiceHandler.java:191)
at org.jboss.as.jpa.processor.PersistenceUnitServiceHandler.deploy(PersistenceUnitServiceHandler.java:126)
at org.jboss.as.jpa.processor.PersistenceBeginInstallProcessor.deploy(PersistenceBeginInstallProcessor.java:52)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:159) [wildfly-server-8.1.0.Final.jar:8.1.0.Final]
... 5 more
I have followed the instructions of the official documentation, but nothing changed. I have added the eclipseLink's jar to "modules\system\layers\base\org\eclipse\persistence\main"
and the module.xml :
<module xmlns="urn:jboss:module:1.3" name="org.eclipse.persistence">
<resources>
<resource-root path="jipijapa-eclipselink-1.0.1.Final.jar"/>
<resource-root path="eclipselink.jar"/>
</resources>
<dependencies>
<module name="asm.asm"/>
<module name="javax.api"/>
<module name="javax.annotation.api"/>
<module name="javax.enterprise.api"/>
<module name="javax.persistence.api"/>
<module name="javax.transaction.api"/>
<module name="javax.validation.api"/>
<module name="javax.xml.bind.api"/>
<module name="org.antlr"/>
<module name="org.apache.commons.collections"/>
<module name="org.dom4j"/>
<module name="org.javassist"/>
<module name="org.jboss.as.jpa.spi"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.vfs"/>
</dependencies>
</module>
Do you know what is the problem ?
Tks
Edit :
My persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="AppPu">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/H2Ds</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
</persistence>
New lines in provider section of persistence.xml won't work (how could it help?).
Wildfly hasn't got provided eclipseLink implementation in libs. To fix this follow this steps:
Download eclipselink.jar (or copy from your maven repo)
Copy it to
destination :
...Wildfly\modules\system\layers\base\org\eclipse\persistence\main
Edit module.xml (same path). Add section
<resource-root path="eclipselink.jar"><filter><exclude path="javax/**" /></filter></resource-root>
After server restart everything should work.
Finally I solved the problem!
in fact, I have a composite unit, all persistence.xml are correct, but the persistence.xml which declared the composite unit was a bad statement of the provider:
<provider>
org.eclipse.persistence.jpa.PersistenceProvider
</provider>
replaced by :
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
and now work fine.
You need to add provider to persistence-unit in your persistence.xml:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
The official documentaiton on how to configure the eclipselin module, and the required system property to active the vfs acrhieve factory impl are both given here:
https://docs.jboss.org/author/display/WFLY10/JPA+Reference+Guide#JPAReferenceGuide-UsingEclipseLink
For the module do something as:
<module xmlns="urn:jboss:module:1.1" name="org.eclipse.persistence">
<resources>
<resource-root path="jipijapa-eclipselink-10.0.0.Final.jar"/>
<resource-root path="eclipselink.jar">
<filter>
<exclude path="javax/**" />
</filter>
</resource-root>
</resources>
<dependencies>
<module name="asm.asm"/>
<module name="javax.api"/>
<module name="javax.annotation.api"/>
<module name="javax.enterprise.api"/>
<module name="javax.persistence.api"/>
<module name="javax.transaction.api"/>
<module name="javax.validation.api"/>
<module name="javax.xml.bind.api"/>
<module name="javax.ws.rs.api"/>
<module name="org.antlr"/>
<module name="org.apache.commons.collections"/>
<module name="org.dom4j"/>
<module name="org.jboss.as.jpa.spi"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.vfs"/>
</dependencies>
</module>
For the system property do something as:
<system-properties>
...
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
</system-properties>
Finally, do not start adding to your persistence.xml any container sepcific properties like:
<property name="eclipselink.target-server" value="JBoss" />
This is completely wrong.
Wildfly is already taking care of puting the proper target server platform in its:
org.jipijapa.eclipselink.EclipseLinkPersistenceProviderAdaptor
Here is a sample of code from their class:
#SuppressWarnings({ "rawtypes", "unchecked" })
#Override
public void addProviderProperties(Map properties, PersistenceUnitMetadata pu) {
if (!pu.getProperties().containsKey(ECLIPSELINK_TARGET_SERVER)) {
properties.put(ECLIPSELINK_TARGET_SERVER, WildFlyServerPlatform.class.getName());
properties.put(ECLIPSELINK_ARCHIVE_FACTORY, JBossArchiveFactoryImpl.class.getName());
properties.put(ECLIPSELINK_LOGGING_LOGGER, JBossLogger.class.getName());
}
}
YOu might want to make sure you debug this class, to make sure it gets invoked and makes your dynamic persistence unit properties all proper.
But do not mess around with persistence.xml properties that are specific to the container. Wildfly is doing this properly and they add them themselves.
So just follow their documentation, that is the best advice.
in EAP with a servicepack there is the trap that the org.eclipse.persistence module might actually be in the .overlays/ tree (modules/system/layers/base/.overlays/).

How to configure Oracle AQ library as a Wildfly 8 module?

I'm currently stuck in the middle of a JBoss migration project from version 4.2.2GA to Wildfly 8.0.0.Final. The project uses the Oracle OCI driver for database access and Oracle AQ with it. Now, I'm starting Wildfly with the environment variable 'LD_LIBRARY_PATH' set to the location where the OCI native implementations reside and everything works fine, except AQ. This is the error I get when the AQ API is used: oracle.jms.AQjmsSession.ociinit([JIIZSII)J: java.lang.UnsatisfiedLinkError: oracle.jms.AQjmsSession.ociinit([JIIZSII)J
This is my module:
path: ${WILDFLY_HOME}/modules/oracle/aq/api/main
contents: aqapi.jar, module.xml
module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="oracle.aq.api">
<resources>
<resource-root path="aqapi.jar" />
</resources>
<dependencies>
<module name="javax.api" />
<module name="javax.jms.api" />
<module name="oracle.jdbc" />
</dependencies>
</module>
So the question now is, what is the reason Wildfly does not propagate the 'LD_LIBRARY_PATH' to the module classloader?
For older JBoss versions I found this issue: https://issues.jboss.org/browse/SOA-3570 which propagates to put the aqapi.jar into the server lib folder as we are doing so for JBoss 4. But how can I solve this issue for Wildfly? Any Ideas?
Thanks!
After a long journey through the shallows of the internet and many tries a colleague of mine finally found a solution.
The solution was to combine both modules to one jdbc/aq module looking so:
path: ${WILDFLY_HOME}/modules/oracle/jdbcaq/main
contents: ojdbc5.jar, aqapi.jar, orai18n.jar, module.xml
module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="oracle.jdbcaq">
<resources>
<resource-root path="aqapi.jar" />
<resource-root path="ojdbc5.jar"/>
<resource-root path="orai18n.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.jms.api" />
<module name="javax.transaction.api"/>
</dependencies>
</module>
I think this is somehow related to the module classloaders of wildfly. Maybe the communication between both modules (jdbc and aq) requires the native implementations to be loaded by the same classloader which causes this error when using two modules instead of a single one.
Instead of setting LD_LIBRARY_PATH, a JBoss/WildFly module can also automatically look for native libraries in a module: https://docs.jboss.org/author/display/MODULES/Native+Libraries
So you can load your shared libraries in ${WILDFLY_HOME}/modules/oracle/jdbcaq/main/lib/linux-x86_64/ either by copying .so files or thanks a symbolic link.

JBoss AS 7.2 Failed to determine implementation class name

When I am trying to call a WSDL-based web service from inside a Resource Adapter, I get the following exception:
SEVERE [org.apache.cxf.BusFactory] (JmsMessageDispatcher#2) Failed to determine BusFactory implementation class name.: java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
at java.lang.Class.asSubclass(Class.java:3126) [rt.jar:1.7.0_45]
at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:333) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:260) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:247) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:99) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:193) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:182) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:166) [cxf-api-2.5.9.jar:2.5.9]
at org.apache.cxf.frontend.ClientProxyFactoryBean.configureObject(ClientProxyFactoryBean.java:99) [cxf-rt-frontend-simple-2.5.9.jar:2.5.9]
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:131) [cxf-rt-frontend-simple-2.5.9.jar:2.5.9]
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:155) [cxf-rt-frontend-jaxws-2.5.9.jar:2.5.9]
During deployment of said Resource Adapter, I get this warning:
WARN [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015893: Encountered invalid class name 'org.springframework.context.ApplicationContext,org.springframework.beans.BeansException' for service type 'org.apache.cxf.bus.factory'
I guess it is like they say: A warning DOES become an error sooner or later ;)
The answer to this question didn't help, since I added the following dependency to my pom.xml already like so:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-api</artifactId>
<version>2.5.9</version>
</dependency>
The Resource Adapter is deployed as a JCA Connector (.rar).
Thanks for any help!
Don't deliver Spring and CXF with your resource adapters. Include them as module dependency.
In your RA project:
pom.xml: use provided scope for CXF libraries
add META-INF/jboss-deployment-structure.xml to RAR archive
META-INF/jboss-deployment-structure.xml
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<module name="org.jboss.ws.cxf.jbossws-cxf-client" services="import" />
<module name="org.apache.cxf"> <!-- .impl removed -->
<imports>
<include path="META-INF" />
<include path="META-INF/cxf" />
</imports>
</module>
<module name="org.springframework.spring">
<imports>
<include path="META-INF" />
</imports>
</module>
</dependencies>
</deployment>
</jboss-deployment-structure>
As spring is not part of JBoss you have to deploy it as new module.
Create module directory $JBOSS_HOME/modules/org/springframework/spring/main/
add module.xml
add the JAR files listed in module.xml to the directory
module.xml
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="org.springframework.spring">
<resources>
<resource-root path="spring-aop-3.2.4.RELEASE.jar" />
<resource-root path="spring-beans-3.2.4.RELEASE.jar" />
<resource-root path="spring-context-3.2.4.RELEASE.jar" />
<resource-root path="spring-core-3.2.4.RELEASE.jar" />
<resource-root path="spring-expression-3.2.4.RELEASE.jar" />
<resource-root path="spring-web-3.2.4.RELEASE.jar" />
</resources>
<dependencies>
<module name="javax.api" />
<module name="javax.servlet.api" />
<module name="javax.transaction.api" />
<module name="org.apache.commons.logging" />
</dependencies>
</module>
I'm not sure if this is a class-loading bug deep down in JBoss or not.

Categories