Skip to content

Conversation

rupert-madden-abbott
Copy link
Contributor

When running on Java 9+, a replacement for JAXB is needed.

It has been recommended to include org.glassfish.jaxb:jaxb-runtime.

However, this jar appears to be a shaded jar.

If Tomcat is triggered to do classpath scanning (e.g. if you are running with JSPs), then it's StandardJarScanner outputs a warning for every jar within jaxb-runtime that it finds.

This additional pattern will exclude it from the scanning to prevent this from happening.

Fix warning on startup where org.glassfish.jaxb:jaxb-runtime's nested jar fails Tomcat scanning.
@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Feb 25, 2019
Copy link
Member

@snicoll snicoll left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR. I've added a suggestion, can you please have a look to it?

@snicoll snicoll added the status: waiting-for-feedback We need additional information before we can continue label Feb 25, 2019
@snicoll
Copy link
Member

snicoll commented Feb 27, 2019

If Tomcat is triggered to do classpath scanning (e.g. if you are running with JSPs), then it's StandardJarScanner outputs a warning for every jar within jaxb-runtime that it finds.

There is no jar in the jaxb-runtime dependency that we provide. Can you please provide a bit more details on your setup or how I can easily reproduce that issue?

@rupert-madden-abbott
Copy link
Contributor Author

I've created a minimal example that should
demonstrate the issue. Just run the main method.

As far as I can see, the jaxb-runtime referenced on this page is a shaded jar?

When I do, I see errors like the following:

2019-02-27 09:41:02.139  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/YOUR_ROOT_DIR/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar] from classloader hierarchy

java.io.IOException: java.lang.reflect.InvocationTargetException
	at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:212) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:65) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:374) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:309) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:278) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:229) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-9.0.16.jar:9.0.16]
	at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-9.0.16.jar:9.0.16]
	at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5125) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:902) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:902) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:928) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.apache.catalina.startup.Tomcat.start(Tomcat.java:455) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:106) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:415) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:154) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at com.github.rupert654.jaxbtomcatscanningbug.Application.main(Application.java:9) ~[classes/:na]
Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.GeneratedConstructorAccessor26.newInstance(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
	at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
	... 46 common frames omitted
Caused by: java.nio.file.NoSuchFileException: C:\Users\rm7088\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.1\jaxb-api-2.3.1.jar
	at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85) ~[na:na]
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) ~[na:na]
	at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108) ~[na:na]
	at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53) ~[na:na]
	at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38) ~[na:na]
	at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:194) ~[na:na]
	at java.base/java.nio.file.Files.readAttributes(Files.java:1763) ~[na:na]
	at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1222) ~[na:na]
	at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:726) ~[na:na]
	at java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:843) ~[na:na]
	at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:246) ~[na:na]
	at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:176) ~[na:na]
	at java.base/java.util.jar.JarFile.<init>(JarFile.java:346) ~[na:na]
	... 50 common frames omitted

2019-02-27 09:41:02.141  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/YOUR_ROOT_DIR/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar] from classloader hierarchy

---snip---

2019-02-27 09:41:02.143  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/YOUR_ROOT_DIR/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar] from classloader hierarchy

---snip---

2019-02-27 09:41:02.144  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/YOUR_ROOT_DIR/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar] from classloader hierarchy

---snip---

2019-02-27 09:41:02.146  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/C:/YOUR_ROOT_DIR/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar] from classloader hierarchy

---snip---

2019-02-27 09:41:02.148  WARN 11948 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/C:/YOUR_ROOT_DIR/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar] from classloader hierarchy

---snip---

@snicoll snicoll added type: enhancement A general enhancement and removed status: waiting-for-feedback We need additional information before we can continue status: waiting-for-triage An issue we've not yet triaged labels Feb 28, 2019
@snicoll snicoll added this to the 2.1.4 milestone Feb 28, 2019
@snicoll snicoll changed the title Add jaxb jars to TldSkipPatterns Add jaxb-runtime to TldSkipPatterns Feb 28, 2019
@snicoll snicoll self-assigned this Feb 28, 2019
snicoll pushed a commit that referenced this pull request Feb 28, 2019
snicoll added a commit that referenced this pull request Feb 28, 2019
* pr/16027:
  Polish "Add `jaxb-runtime` to TldSkipPatterns"
  Add `jaxb-runtime` to TldSkipPatterns
@snicoll snicoll closed this in 2a6791a Feb 28, 2019
@snicoll
Copy link
Member

snicoll commented Feb 28, 2019

Thanks for reporting the issue @rupert654 and for the PR. I've used jaxb-runtime-* in the end as this particular jar has a faulty manifest and Tomcat is processing it so excluding that single jar is enough to get rid of those warnings.

@rupert-madden-abbott rupert-madden-abbott deleted the patch-1 branch February 28, 2019 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: enhancement A general enhancement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants