Sorry if this is a daft question I haven't managed to find a straight answer.
I have compiled a program written with Java 9 features and produced a .jar.
The nature of the program is that I need it running on two machines at once, one is running java 8 and one is running Java 9. My program is not working, specifically jdk.incubator.httpclient module is failing to send a HttpRequest from one machine to the other.
Updating the JDK8 machine to 9 is not an option.
My questions is, once it all becomes bytecode does it matter? Will there be bytecode in the Java 9 produced jar that the Java 8 JVM can't understand?
Possibly worth noting I have to run the jar with java -jar --add-modules=jdk.incubator.httpclient
to make use of the new java 9 incubator module httpclient
I understand a smart solution would be to make sure the firewall's on both sides allow these two to talk, however I would like to know the answer to the above as well!
Thanks in advance.
Here is the stacktrace:
2018-01-09 01:15:57.410 INFO 4656 --- [nio-8080-exec-2] c.e.s.controller.MessageController : [TO http://192.168.1.64:8080/send] Hello Bob it is Jim!
2018-01-09 01:18:08.551 ERROR 4656 --- [nio-8080-exec-2] c.e.s.service.MessagingService : send: unable to send request
java.net.ConnectException: Connection timed out
at java.base/sun.nio.ch.Net.connect0(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.connect(Net.java:454) ~[na:na]
at java.base/sun.nio.ch.Net.connect(Net.java:446) ~[na:na]
at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648) ~[na:na]
at jdk.incubator.httpclient/jdk.incubator.http.PlainHttpConnection.connect(PlainHttpConnection.java:142) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.Http1Exchange.sendHeadersOnly(Http1Exchange.java:136) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.Exchange.responseImpl0(Exchange.java:298) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.Exchange.responseImpl(Exchange.java:245) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.Exchange.response(Exchange.java:121) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.MultiExchange.response(MultiExchange.java:154) ~[jdk.incubator.httpclient:na]
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl.send(HttpClientImpl.java:234) ~[jdk.incubator.httpclient:na]
at com.example.simplemessenger/com.example.simplemessenger.service.MessagingService.send(MessagingService.java:30) ~[classes/:na]
at com.example.simplemessenger/com.example.simplemessenger.controller.MessageController.sendMessage(MessageController.java:71) [classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-4.3.13.RELEASE.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) [spring-web-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.13.RELEASE.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/javax.servlet.http.HttpServlet.service(HttpServlet.java:661) [tomcat-embed-core-8.5.23.jar:na]
at spring.webmvc@4.3.13.RELEASE/org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.websocket@8.5.23/org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.13.RELEASE.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108) [spring-web-4.3.13.RELEASE.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-4.3.13.RELEASE.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.13.RELEASE.jar:na]
at spring.web@4.3.13.RELEASE/org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.13.RELEASE.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.23.jar:na]
at tomcat.embed.core@8.5.23/org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.23.jar:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) [na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) [na:na]
at tomcat.embed.core@8.5.23/org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.23.jar:na]
at java.base/java.lang.Thread.run(Thread.java:844) [na:na]
2018-01-09 01:18:08.552 INFO 4656 --- [nio-8080-exec-2] c.e.s.controller.MessageController : failed to send
The answer is yes. The tool javap
can be used to see this, on Java 8
$ javap -v Hello.class | grep "version"
minor version: 0
major version: 52
And on Java 9, you'd see
minor version: 0
major version: 53
However, you can use the compiler flags -target
and -source
to make the Java 9 compiler produce Java 8 compatible code.
$ javac -source 1.8 -target 1.8 Hello.java
However, that new incubator may not have been backported to Java 1.8; in which case, I would suggest the best bet is to use apache HttpComponents - that should work on both.