On 31/03/2016 11:20, Sanne Grinovero wrote:
Thanks Alex,
that clarifies a lot, I was just about to try with a different dependency.

So this is not a reflection bug, but I'm just realising now that has
quite significant impact on JavaEE:
the Synchronization type is defined as public API of the specification [1].

Changing the JavaEE API isn't going to be very popular, so I guess the
expectation is for
containers to regularly override the modules?
This won't affect just the regular EE application servers, as these
APIs are often used also
in standalone JavaSE applications, as many components of the JavaEE spec can
be run in "standalone" or "embedded" modes.

For example Hibernate will now have to require the application launcher to apply
customizations to the JVM boot parameters, and probably so any other JPA
implementation.

1 - http://docs.oracle.com/javaee/7/api/javax/transaction/Synchronization.html

Java EE implementations have always upgraded/replaced a number of APIs that are "shared" with Java SE. The JSR-250 defined "Common Annotations" is another example where Java SE defines a subset of the API and Java EE implementations need the deploy with the full API. So there isn't anything forcing anyone to change APIs, this is really just about how to compile or run with the Java EE versions of these components.

With JDK 8 and older then the only supported way of upgrading these components was the Endorsed Standards Override Mechanism. It turns out that this wasn't widely used and instead app servers and others have been putting JAR files on the class path with these components. Incredibly this worked even though it wasn't actually overriding the classes in the Java SE defined subset.

Moving to modules means that EE servers will need to deploy with the EE versions of these modules. Adding the class path isn't going to work because the module system will prohibit splitting packages between modules and the class path. The way to do this is, as Alex mentioned, is the upgrade module path.

Patching will work too, at least to get something going. In this case you can patch the java.transaction module with:

   -Xpatch:java.transaction=transaction-api_1.2.jar

There aren't any additional packages exported in the EE version so -XaddExports isn't neded. The equivalent with the Common Annotations would need -XaddExports because the EE version has APIs in packages that Java SE does not define.

One final thing to mention is that there is a proposal in the works to not resolve the EE modules when compiling code in the unnamed module or running code where the initial class is on the class path. For existing deployments then it would looking like that the JDK doesn't have the EE modules. This isn't fully implemented in the current builds but it is a proposal that will make migration to JDK 9 much easier for many. For those using the EE components outside the context of an app server then it would mean using `-addmods java.se.ee` so that all of the EE modules are resolved. I'm sure there will be more on this topic soon.

-Alan








Reply via email to