Oracle WebLogic 14 en JDK 11

Tue 3/31/2020 8:35 PM – We are pleased to announce the release of Oracle WebLogic Server and Coherence 14.1.1.0.0.

WebLogic 14 ondersteunt JavaEE 8 en is gecertificeerd voor JDK 11. De grootste kopzorgen voor de meeste ontwikkelaars zal zijn het overstappen naar JDK 11, aangezien dit een modulaire JDK is. Eigenlijk valt dit 100% mee, we zetten e.e.a. voor je op een rij.

Laten we als eerste stap WebLogic 14 met JDK 11 eens installeren en configureren. Voor deze stappen maken we gebruik van Ansible, bijvoorbeeld zoals hier is uitgelegd.

In het geval van onze opzet hoeven we alleen het volgende te veranderen

# Name of JVM file that is used in the installation
#jvm_file_name:             "jdk-8u231-linux-x64.tar.gz"
jvm_file_name:             "jdk-11.0.6_linux-x64_bin.tar.gz"
    
# Name of the WebLogic file that is used in the installation
weblogic_file_name:        "fmw_14.1.1.0.0_wls_generic.jar"
...
# The JRE is no longer supported and the important security files are under $JAVA_HOME/conf/security. 
# The files rt.jar and tools.jar no longer exist.
#java_security:              "{{ java_home }}/jre/lib/security/java.security"
java_security:              "{{ java_home }}/conf/security/java.security"

[ansible@datanode ansible]$ ansible-playbook wls_admin_server.yml --inventory=inventories/production/wls_hosts.cfg
...
PLAY RECAP ************************************************************************************************************************************************************************
javanode1                  : ok=40   changed=31   unreachable=0    failed=0

[ansible@datanode ansible]$ ansible-playbook wls_managed_servers.yml --inventory=inventories/production/wls_hosts.cfg
...
PLAY RECAP ************************************************************************************************************************************************************************
javanode2                  : ok=31   changed=24   unreachable=0    failed=0

Aangezien WebLogic alle jars in het classpath plaatst

setDomainEnv
. ${WL_HOME}/../oracle_common/common/bin/commEnv.sh
commEnv
. $MW_HOME/oracle_common/common/bin/commBaseEnv.sh -> FMWCONFIG_CLASSPATH
. $MW_HOME/oracle_common/common/bin/commExtEnv.sh -> PROFILE_CLASSPATH -> ${WL_HOME}/server/lib/weblogic.jar

worden alle jars onderdeel van de unnamed module:

Single-module mode is used to compile code organized in a traditional package-hierarchical directory tree. It is the natural replacement for simple uses of legacy mode of the form

$ javac -d classes -classpath classes -sourcepath src Foo.java

If a module descriptor in the form of a module-info.java or module-info.class file is specified on the command line, or is found on the source path or the class path, then source files will be compiled as members of the module named by that descriptor and that module will be the sole root module. Otherwise if the –module option is present then source files will be compiled as members of , which will be the root module. Otherwise source files will be compiled as members of the unnamed module, and the root modules will be computed as described above.

–illegal-access=permit opens each package in each module in the run-time image to code in all unnamed modules, i.e., to code on the class path, if that package existed in JDK 8. This enables both static access, i.e., by compiled bytecode, and deep reflective access, via the platform’s various reflection APIs.

The application class loader first searches the named modules defined to all of the built-in loaders. If a suitable module is defined to one of these loaders then that loader will load the class. If a class is not found in a named module defined to one of these loaders then the application class loader delegates to its parent. If a class is not found by its parent then the application class loader searches the class path. Classes found on the class path are loaded as members of this loader’s unnamed module.

To make it easier for existing application servers to migrate to JDK 9. Application servers often override the content of one or more of these modules, and in the near term they are most likely to do so by continuing to place the necessary non-modular JAR files on the class path. If these modules were resolved by default then the maintainers of application servers would have to take awkward actions to exclude them in order to override them.

WebLogic 14 is bedoeld om naast JDK 11 te bestaan, maar profiteert niet van alle JDK 11-features. Alle jar files blijven normale jars en geen Java modules met een module-info.class, en bevinden zich op het classpath en niet het module path. Het resultaat is dat alle classes deel uitmaken van de unnamed module. Als we een package van de unamed module in een named modules willen benaderen, kunnen we compileren en runnen met --add-exports com.example.app=ALL-UNNAMED.

Als we kijken hoe de class loaders gestructureerd zijn, zien we het volgende

Class Name                                                                                   | Defined Classes | No. of Instances
----------------------------------------------------------------------------------------------------------------------------------
weblogic.utils.classloaders.ChangeAwareClassLoader @ 0xe3831050                              |              13 |                2
|- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe3593380                        |              16 |               93
|  |- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe380cd60                     |               0 |                0
|  |  '- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe2a24998                  |              17 |               25
|  |     |- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe1f96ce8               |               3 |                1
|  |     |  |- parent com.oracle.classloader.weblogic.LaunchClassLoader @ 0xe117e708         |          22,718 |          227,777
|  |     |  |  |- parent jdk.internal.loader.ClassLoaders$AppClassLoader @ 0xe0dd72a8        |              75 |            9,491
|  |     |  |  |  |- parent jdk.internal.loader.ClassLoaders$PlatformClassLoader @ 0xe0dd7320|              98 |              158
----------------------------------------------------------------------------------------------------------------------------------

Class Name                                                                 | Defined Classes | No. of Instances
----------------------------------------------------------------------------------------------------------------
weblogic.utils.classloaders.ChangeAwareClassLoader @ 0xe3831050            |              13 |                2
|- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe3593380      |              16 |               93
|  |- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe380cd60   |               0 |                0
|  |  '- parent weblogic.utils.classloaders.GenericClassLoader @ 0xe2a24998|              17 |               25
|  |- model.entities.Person                                                |                 |               71
|  |- com.sun.proxy.$Proxy196                                              |                 |               11
|  |- com.sun.proxy.$Proxy266                                              |                 |                2
|  |- com.sun.proxy.$Proxy267                                              |                 |                2
|  |- model.logic.Company_hufak0_Impl                                      |                 |                2
|  |- com.sun.proxy.$Proxy275                                              |                 |                1
|  |- model.logic.CompanyMDB                                               |                 |                1
|  |- model.logic.Company_hufak0_CompanyImpl                               |                 |                1
|  |- model.logic.Company_hufak0_CompanyImpl_WLSkel                        |                 |                1
|  |- weblogic.ejb.container.internal.StatelessEJBHomeImpl_14110_WLStub    |                 |                1
|  |- com.sun.proxy.$Proxy162                                              |                 |                0
|  |- model.logic.Company                                                  |                 |                0
|  |- model.logic.Company$1416379342$Proxy$_$$_Weld$EnterpriseProxy$       |                 |                0
|  |- model.logic.CompanyBean                                              |                 |                0
|  |- model.logic.Company_hufak0_CompanyRIntf                              |                 |                0
|  |- model.logic.Company_hufak0_Intf                                      |                 |                0
|  '- Total: 17 entries                                                    |                 |                
|- userinterface.beans.SomeMessage                                         |                 |                1
|- userinterface.servlets.NormalServlet                                    |                 |                1
|- userinterface.beans.Message                                             |                 |                0
|- userinterface.listeners.AsyncListenerImpl                               |                 |                0
|- userinterface.listeners.ReadListenerImpl                                |                 |                0
|- userinterface.listeners.WriteListenerImpl                               |                 |                0
|- userinterface.servlets.AsyncServlet                                     |                 |                0
|- userinterface.servlets.AsyncServlet$1                                   |                 |                0
|- userinterface.servlets.NonBlockingServlet                               |                 |                0
|- userinterface.servlets.NonBlockingServlet$1                             |                 |                0
|- userinterface.servlets.NonBlockingServlet$1$1                           |                 |                0
|- userinterface.servlets.UploadServlet                                    |                 |                0
|- userinterface.tasks.SomeTask                                            |                 |                0
----------------------------------------------------------------------------------------------------------------

Gezien vanuit het perspectief van een applicatie ontwikkelaar is er in het algemeen niet veel veranderd ( naamgeving jdk.internal.loader.ClassLoaders$PlatformClassLoader, en de bootsclassloader is verdwenen ). De -Xbootclasspath/a en -Djava.endorsed.dirs features worden niet langer ondersteunt. Merk op dat endorsed directories in het algemeen gebruikt werden voor updated JavaEE classes in het geval dat JavaSE niet was bijgewerkt. In feite heeft WebLogic 14 twee endorsed jar-bestanden voor JavaEE 8-ondersteuning bij het draaien op JDK 8. Voor JDK 11 zijn de JavaEE-klassen verwijderd uit JavaSE en worden ze aangeboden op het classpath.

Daarnaast hebben we het volgende

The run-time behavior of some Java SE APIs has changed, though in ways that continue to honor their existing specifications:

The application and platform class loaders are no longer instances of the java.net.URLClassLoader class, as noted above. Existing code that invokes ClassLoader::getSystemClassLoader and blindly casts the result to URLClassLoader, or does the same thing with the parent of that class loader, might not work correctly.

De Java optie -Djava.ext.dirs wordt ook niet langer ondersteund. Merk op dat de -Dweblogic.ext.dirs system property die gebruikt wordt voor het overriden van de DOMAIN_HOME/lib directory voor de shared library feature niet gerelateerd is aan de Java optie.

Eén van de grote migratieproblemen is dat veel code reflection op een JDK-class gebruikt. Voor nu krijgen we dan warnings zoals onderstaand te zien

WLST:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.netty.util.internal.ReflectionUtil (file:/u01/app/oracle/weblogic14.1.1/installation/wlserver/modules/com.oracle.weblogic.internal.thirdparty.jython.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of org.python.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

WebLogic Server Logging:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by javassist.util.proxy.SecurityActions (file:/u01/app/oracle/weblogic14.1.1/installation/oracle_common/modules/org.javassist.javassist.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of javassist.util.proxy.SecurityActions
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Het is niet eenvoudig om dit soort gedrag te verwijderen. Gelukkig is het voorlopig nog steeds een waarschuwing en blijft het in ieder geval in JDK 14 ook een waarschuwing.

In WebLogic 14 wordt zoveel mogelijk verborgen om een overstap na JDK 11 zo soepel mogelijk te laten verlopen. Natuurlijk zijn er meer gedragsveranderingen en verwijderde classes en methods, waar applicaties tegenaan kunnen lopen en hier kunnen we als Axis into ICT ondersteuning bieden.

Scroll to Top