maven datanucleus ASM issue - maven

I got following error when build maven datanucleus based project. I have placed maven-datanucleus-plugin under plugin and correctly define the path which contains persistent classes. Can anybody to help in this problem?
Exception in thread "Thread-1" You have selected to use ClassEnhancer "ASM" yet
the JAR for that enhancer does not seem to be in the CLASSPATH!
org.datanucleus.enhancer.NucleusEnhanceException: You have selected to use Class
Enhancer "ASM" yet the JAR for that enhancer does not seem to be in the CLASSPAT
H!
at org.datanucleus.enhancer.DataNucleusEnhancer.init(DataNucleusEnhancer
.java:212)
at org.datanucleus.enhancer.DataNucleusEnhancer.addClasses(DataNucleusEn
hancer.java:370)
at org.datanucleus.enhancer.EnhancerProcessor$EnhanceRunnable.run(Enhanc
erProcessor.java:163)
at java.lang.Thread.run(Thread.java:662)
Thank you.

So you want to use the enhancer and don't put asm.jar in the CLASSPATH, as per the docs. Can't be clearer.

Related

Primitive Axon App run as Fat JAR Doesn't Autoconfigure Axon Beans

PROBLEM:
RESEARCH: At https://gitlab.com/ZonZonZon/simple-axon.git I've made up a simple Axon-app to show that JAR-artifact built with Gradle-plugin com.github.johnrengelman.shadow doesn't autoconfigure Axon beans when (when run as JAR). Though it runs fine under Intellij.
From project root in terminal:
run gradle clean build shadowJar;
java -jar build/simpleaxon.jar;
Stacktrace is enclosed here. I expect that Axon Autocongiguration provides beans like CommandBus, Snapshotter and other by default.
QUESTION: How to autoconfigure default axon beans in a fat jar?
So, this took my some investigation to get a hunch what is going wrong, but I know what the problem is.
Quick notice, it's not an Axon specific thing, rather the plugin you are using.
I ran your sample project and indeed ended up with the same result; no Axon beans were being wired, ever. That led me to investigate the process of creating fat JAR's step by step. First Maven, then Spring Boot with Maven, then Gradle with Spring Boot and finally with the Shadow plugin you are referring too.
This endeavour landed me on this issue, which states as much as "projects which require the use of META-INF files need to add this to the shadow plugin, and this should be documented".
The portion referenced through this is the following:
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer
// Left out all other specifics from your 'build.gradle' file
shadowJar {
// Required for Spring
mergeServiceFiles()
append 'META-INF/spring.handlers'
append 'META-INF/spring.schemas'
append 'META-INF/spring.tooling'
transform(PropertiesFileTransformer) {
paths = ['META-INF/spring.factories' ]
mergeStrategy = "append"
}
setArchiveFileName("simpleaxon.jar")
getDestinationDirectory().set(new File(projectDir, "./build"))
}
After adding that piece of logic to your build.gradle file, I could run your sample project as expected.
I've hit a similar issue when using Axon in a multimodule Gradle project. The app would not work when packaged and worked fine in IDE. The exact error I was getting was
org.axonframework.messaging.annotation.UnsupportedHandlerException: Unable to resolve parameter 0 in handler
The reason for this was because ParameterResolverFactories were not loaded due to the META-INF/services resources not being resolved correctly in the shadow jar plugin as #Steven hinted.
I've managed to fix it with simply (using Kotlin DSL in Gradle):
tasks.shadowJar {
mergeServiceFiles()
}
#Steven 's solution was the only one working for me, after searching for a long time for other solutions.
The Gradle Kotlin Version looks like this https://github.com/spring-projects/spring-boot/issues/1828#issuecomment-607352468:
import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer
plugins {
id("com.github.johnrengelman.shadow") version "7.1.2"
}
...
tasks.shadowJar {
// Required for Spring.
// The shadowJar plugin should merge the services correctly, but it doesn't!
mergeServiceFiles()
append("META-INF/spring.handlers")
append("META-INF/spring.schemas")
append("META-INF/spring.tooling")
transform(
PropertiesFileTransformer().apply {
paths = mutableListOf("META-INF/spring.factories")
mergeStrategy = "append"
})
}

How to config #RetryTransaction in Spring?

I get this error :
Getting “Deadlock found when trying to get lock; try restarting transaction”
I'm trying to resolve it using annotation RetryTransaction with #Transactionnal.
But the annotation cannot be resolved to a type.
What is the config to set in spring-config.xml to make it work ? or maybe supplementary dependecies to install ?
Googling a bit reveals that the annotation you mentioned is not from spring, but someone else produced it.
You can get the maven artefact that contains it from here http://mvnrepository.com/artifact/org.dellroad/dellroad-stuff/1.0.659

Spring - Error using "JDBCTemplate": The method "X" refers to the missing type DataAccessException

I´m developing in STS and when I´m going to use JDBC Template I´ve got several errors :S...
I´ve got my DAOImplementation and I want to redefine the JDBCTemplate, but all the methods I´m redefining returns errors like:
The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced from required .class files
The method query(String, RowMapper) from the type JdbcTemplate refers to the missing type DataAccessException
Concretly, the methods are:
Update.
QueryForString.
Query.
I have imported all dependencies for Maven, I don´t know what is happening...
I hope you could help me, thanks for all :).
Juandi.
In spring 3 the whole jar structure has been re-organized. There is no all-in-one spring.jar as before. You have to pick what you need.
DataAccessException is in org.springframework.transaction-3.0.0.RELEASE.jar
include this jar in class path.
i had same problem add the spring-tx-XXX.jar to you project xxx means version
In spring framework 4.1, "org.springframework.transaction.xxx.jar" is to be imported instead of spring-tx-xxx.jar
Adding
org.springframework.transaction-3.0.1.RELEASE-A.jar
solve my problem
Same on my case, I used Spring-mvc 4.3.0 and have a spring-tx.4.3.0 and DataAccessException in there.
But I haved an error like your case.
Solution : I just deleted Spring-tx Folder dependency in maven repo (.m2/repository/) and update dependency again. It was solved to me.

spring 3.x issue of no such method error

Hi i am using spring framework and while executing annotationbased test case i am getting error can any one have idea about which jar dependancy(maven artifact) file do i need to add in my pom.xml ?
org.springframework.transaction.interceptor.TransactionAttribute.getQualifier() no such method error
Looks like you have two incompatible jars.
Check that: spring-tx and spring-test is of the same version (3.0.x).
If this does not help. Place a break point at TransactionalTestExecutionListener and check that the concreate class that implements TransactionAttribute is of correct version too.

XSLT ClassCastException in WebSphere when Spring tries to create an AnnotationMethodHandlerAdapter

When starting WebSphere, I get this exception:
Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]:
Constructor threw exception; nested exception is java.lang.ClassCastException:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl incompatible with
javax.xml.transform.TransformerFactory
Caused by: java.lang.ClassCastException: com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
incompatible with javax.xml.transform.TransformerFactory
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.<init>(AbstractXmlHttpMessageConverter.java:47)
at org.springframework.http.converter.xml.SourceHttpMessageConverter.<init>(SourceHttpMessageConverter.java:45)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.<init>(AnnotationMethodHandlerAdapter.java:197)
This doesn't seem have any impact on any beans in my applicationContext.xml but it's still odd. For me, this looks as if IBM classes are leaking into my application.
How can I fix this? I already set the option "Access to internal server classes" to "Restrict".
It was indeed a class-loading issue, however this cannot be solved by changing class-loader settings.
The problem was that the xml-apis and javax.xml jars were being imported over some maven dependencies.
Since we already set the class loader policies for the application to PARENT_LAST, the javax.xml.transform.TransformerFactory was being loaded from the WebApp-Class loader from our jar files.
However its implementation 'com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl' was coming from the server class loader, this one was linked to the javax.xml.transform.TransformerFactory provided by the JDK/JRE.
Since the classes were loaded from different sources a ClassCastException was thrown.
Removing all dependencies to xml-apis / xerces / javax.xml jars solved the problem.
Since these APIs are now part of the JDK they no longer need to be imported.
... and if you wonder why I know so much about this issue: I work together with Aaron. ;)
I can't speak for Restrict as I have no personal experience with it,But I think the problem is more to do with IBM Class Loader. The class you are referring to is part of IBM Java implementation of TransformerFactory, I think you can try one of the following to solve this issue on hand
Either change the server class loader policy to PARENT_LAST (This way class loader will find the class from application's local class path, before going to up the chain all the way to java run time)
The other option would be look at the jaxp.properties file, I think it is located in (was_root\java\jre\lib), I only read about this option never actually used it
Why do you say IBM classes are leaking into your application?
The TransformerFactory is asked to create a newInstance. It follows a sequence of steps to determine which TransformerFactory to use. If none of the config is specified, it simply chooses to use the default factory.
Here is the javadoc for TransformerFactory:
http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html#newInstance()
What is the OS ? Is that AIX?
http://www.ibm.com/developerworks/java/jdk/aix/j664/sdkguide.aix64.html
Looking at this doc (link above) for AIX it tells me that this is the default Impl:
javax.xml.transform.TransformerFactory
Selects the XSLT processor. Possible values are:
com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl
Use the XL TXE-J compiler. This value is the default.
Post back additional information so that we can try and troubleshoot this.
HTH
Manglu

Resources