Open gestshb opened 5 years ago
The warning comes from JasperReports XML parsing code which instantiates a grammar cache by reflection when it detects the Xerces parser included in Oracle JRE (under com.sun.org.apache.xerces) being used. Details about Xerces grammar caching can be found at http://xerces.apache.org/xerces2-j/faq-grammars.html
Grammar caching provides a performance improvement on JRXML parsing, which is usually performed during report compilation. It is currently implemented for Oracle JRE Xerces and for the original Apache Xerces.
There are several ways to get rid of the illegal reflective access warning:
--add-opens java.xml/com.sun.org.apache.xerces.internal.util=<module-name|ALL-UNNAMED>
as option to the Java process.net.sf.jasperreports.compiler.xml.parser.cache.schemas=false
in jasperreports.properties. This would disable grammar caching for both Apache Xerces and Oracle JRE Xerces.We're of course considering what to do to avoid the warning in the future. Some options are:
net.sf.jasperreports.compiler.xml.parser.cache.schemas
property to default to false
. Grammar caching would only be enabled for people who explicitly set the property.XMLGrammarCachingConfiguration
. Not sure though if it would work in the context of JasperReports XML parsing.Is the property "net.sf.jasperreports.compiler.xml.parser.cache.schemas
" still valid? I am using jasperreport 6.12.1 jar with custom property
<property name="net.sf.jasperreports.compiler.xml.parser.cache.schemas" value="false"/>
No change. I still get the error message:
WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils (file:/C:/Users/user/.m2/repository/net/sf/jasperreports/jasperreports/6.12.1/jasperreports-6.12.1.jar) to constructor com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl()
Is the property "
net.sf.jasperreports.compiler.xml.parser.cache.schemas
" still valid? I am using jasperreport 6.12.1 jar with custom property<property name="net.sf.jasperreports.compiler.xml.parser.cache.schemas" value="false"/>
No change. I still get the error message:
WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils (file:/C:/Users/user/.m2/repository/net/sf/jasperreports/jasperreports/6.12.1/jasperreports-6.12.1.jar) to constructor com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl()
You have to create the file jasperreports.properties
, write this line on it: net.sf.jasperreports.compiler.xml.parser.cache.schemas=false
and then put it under src/main/resources
(at least this way it worked for me on a Spring Boot 2 application)
Hope it helps :)
Is the property "
net.sf.jasperreports.compiler.xml.parser.cache.schemas
" still valid? I am using jasperreport 6.12.1 jar with custom property<property name="net.sf.jasperreports.compiler.xml.parser.cache.schemas" value="false"/>
No change. I still get the error message: WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils (file:/C:/Users/user/.m2/repository/net/sf/jasperreports/jasperreports/6.12.1/jasperreports-6.12.1.jar) to constructor com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl()You have to create the file
jasperreports.properties
, write this line on it:net.sf.jasperreports.compiler.xml.parser.cache.schemas=false
and then put it undersrc/main/resources
(at least this way it worked for me on a Spring Boot 2 application)Hope it helps :)
Thank @durimkryeziu in my case it worked
@dadza Thanks :) Worked for me as well.
It is also working with Quarkus :-)
Side question: Why can't this be solved directly in the code of jasperreport?
Please be aware this will prevent JasperReports to work out of the box with JDK 17 LTS which will ship in September.
@marschall From where did you get this information? And if this is correct do you have already the solution/fix for this?
@Paul6552 JEP 403: Strongly Encapsulate JDK Internals → all illegal access will throw an exception and you will have to add --add-opens
command line arguments to prevent this
Not completely sure if the owners of this library have to change some internal code or the programmers using this library. Anyway thanks for the information :)
work for me thanks @durimkryeziu
Is the property "
net.sf.jasperreports.compiler.xml.parser.cache.schemas
" still valid? I am using jasperreport 6.12.1 jar with custom property<property name="net.sf.jasperreports.compiler.xml.parser.cache.schemas" value="false"/>
No change. I still get the error message: WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils (file:/C:/Users/user/.m2/repository/net/sf/jasperreports/jasperreports/6.12.1/jasperreports-6.12.1.jar) to constructor com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl()You have to create the file
jasperreports.properties
, write this line on it:net.sf.jasperreports.compiler.xml.parser.cache.schemas=false
and then put it undersrc/main/resources
(at least this way it worked for me on a Spring Boot 2 application)Hope it helps :)
with Java v 11 and dependency jasperreports v 6.18.1 Me salvaste , saludos work for me thanks @durimkryeziu
It is also working with Quarkus :-)
Side question: Why can't this be solved directly in the code of jasperreport?
please help sir, i use quarkus, and still have this issue
On JDK 16+ this becomes an error
This helped:
Add an Apache Xerces jar to the application classpath, so that it gets used as SAX implementation instead of the Oracle JRE Xerces.
Up-to-date (21-01-2022) dependency so you don't have to search:
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
</dependency>
We're of course considering what to do to avoid the warning in the future
@dadza Has any progress been made on this issue? With JDK 17 LTS being out for some time now and JDK 21 LTS being around the corner, JasperReports should have a better out of the box experience.
Can't jasperreports add a dependency on Apache Xerces and simply remove the code supporting Oracle JRE Xerces?
I am not a SpringBoot project, what should I do?
@dadza any news on Jasper 7.0.0? Still having troubles with the error "WARNING: Illegal reflective access by net.sf.jasperreports.engine.util.ClassUtils" - I'm using Java 17.
For me, neither adding Xerces do pom nor creating 'jasperreports.properties' with the cache property setted to false solved the issue.
Actually, I don't even see this error on logs - could only capture it while running with Java 11. On Java 17, not even the catch block around the jasper flow works (I get no log, only a 500 response code).
I am using jasper report 6.8.0 in my project and i get this warning when i upgrade to java 11
i get it when i invoke this line
JasperCompileManager.compileReportToStream(getClass().getResourceAsStream(jasper), fileOutputStream);