Executive Summary: The WebLogic Java Lifecycle Challenge
In enterprise application architectures supporting PeopleSoft Internet Architecture (PIA), Ellucian Banner 9, or custom Oracle Fusion Middleware clusters, Oracle WebLogic Server represents the primary transaction gateway.
While quarterly WebLogic Patch Set Updates (PSUs) patch application-level libraries and security filters, WebLogic remains entirely dependent on the host Java Development Kit (JDK). When critical security updates (CPUs) are released for Oracle Java SE, systems administrators face a complex operational matrix:
- WebLogic Node Manager and Managed Servers each have distinct JVM startup vectors.
- Environment scripts (
commEnv.sh,setDomainEnv.sh) frequently contain hardcoded JDK paths. - Node Manager service definitions (systemd on Linux or Windows Services) cache their own JVM pointers.
- Upgrading the JDK without synchronizing custom certificates or Node Manager SSL keys breaks remote server lifecycle management and causes cluster partitioned states.
This runbook delivers an audited, step-by-step engineering playbook to perform side-by-side JDK upgrades across WebLogic domains with zero unplanned downtime and full rollback capability.
Architectural Mapping: WebLogic JVM Dependency Tree
Before editing configuration files, visualize how WebLogic instances inherit their JVM runtime:
+-------------------------------------------------------------------------+
| Fusion Middleware Home ($ORACLE_HOME) |
| |
| +---------------------------------------------------------------------+ |
| | Common Environment ($ORACLE_HOME/oracle_common/common/bin/commEnv.sh)| |
| | Defines default JAVA_HOME, JAVA_VENDOR, and JVM architecture | |
| +---------------------------------------------------------------------+ |
| | (inherited by) |
| v |
| +---------------------------------------------------------------------+ |
| | Domain Environment ($DOMAIN_HOME/bin/setDomainEnv.sh) | |
| | Overrides SUN_JAVA_HOME / JAVA_HOME per domain | |
| | Defines heap limits, GC flags (-XX:+UseG1GC), and JMX parameters | |
| +---------------------------------------------------------------------+ |
| | | |
| v v |
| +---------------------------+ +-------------------------------+ |
| | Admin Server ($JAVA_HOME) | | Node Manager | |
| | (AdminServer.log) | | ($DOMAIN_HOME/nodemanager/ | |
| | | | nodemanager.properties) | |
| | | | -> JavaHome parameter | |
| +---------------------------+ +-------------------------------+ |
| | |
| v (spawns) |
| +-------------------------------+ |
| | Managed Servers (WLS Cluster) | |
| | (PIA_MS1, BANNER_MS1, etc.) | |
| +-------------------------------+ |
+-------------------------------------------------------------------------+
Critical Rules of WebLogic JDK Upgrades:
- Never perform in-place overwrites: Always unpack the new JDK into a distinct directory (e.g.,
/u01/app/oracle/product/java/jdk1.8.0_421). - Synchronize Node Manager first: Node Manager spawns Managed Servers on remote hosts. If Node Manager is running an older incompatible JDK or cannot locate the new Java path, managed server restarts will fail.
- Preserve Custom Trust Stores: WebLogic domains with custom SSL/TLS certificates (e.g., custom identity and trust keystores) often point to Java’s default
cacertsfor external outbound SSL (LDAPS, database TCPS listeners, and external payment gateways).
Phase 1: Pre-Upgrade Discovery & Audit
Execute these diagnostic commands on each cluster node as the oracle user:
1. Identify Running Java Processes and Active JDK Paths
# Locate active WebLogic processes (Admin Server, Node Manager, Managed Servers)
ps -ef | grep weblogic.Server | grep -v grep
# Check running Node Manager process
ps -ef | grep -i nodemanager | grep -v grep
# Verify the exact Java binary executing the Admin Server
ADMIN_PID=$(pgrep -f "weblogic.Server.*AdminServer" | head -n 1)
ls -l /proc/$ADMIN_PID/exe
# Extract the active JAVA_HOME from the running process environment
cat /proc/$ADMIN_PID/environ | tr '\0' '\n' | grep -E "^JAVA_HOME="
2. Verify WebLogic Certification Matrix
Before selecting a target JDK version, verify certified releases for your specific WebLogic release:
- WebLogic 12.2.1.4: Certified on Oracle JDK 8 (LTS up to latest CPU update, e.g.,
8u421+). (Experimental JDK 11 support exists under specific patch constraints, but JDK 8 remains production standard). - WebLogic 14.1.1.0: Certified on Oracle JDK 8, JDK 11, and JDK 17.
Phase 2: Deploying New JDK & Keystore Preparation
1. Unpack the New JDK Binaries
Download the appropriate Oracle Java SE CPU archive for Linux x64 and extract it into the standard Java directory:
# Standard Oracle middleware java home directory
cd /u01/app/oracle/product/java
# Extract new JDK update
tar -xzf /tmp/jdk-8u421-linux-x64.tar.gz
# Set proper ownership and permissions
chown -R oracle:oinstall jdk1.8.0_421
chmod -R 755 jdk1.8.0_421
2. Test Execution & Binary Validation
# Verify the binary runs correctly and displays the updated patch level
/u01/app/oracle/product/java/jdk1.8.0_421/bin/java -version
3. Migrate Custom Root / Intermediate CAs into the New cacerts
If your WebLogic domain relies on the default trust keystore ($JAVA_HOME/jre/lib/security/cacerts) for enterprise CAs (e.g., Active Directory / LDAPS or internal database listeners), migrate custom certificates:
OLD_JDK="/u01/app/oracle/product/java/jdk1.8.0_391"
NEW_JDK="/u01/app/oracle/product/java/jdk1.8.0_421"
# Compare certificate count
$OLD_JDK/bin/keytool -list -keystore $OLD_JDK/jre/lib/security/cacerts -storepass changeit | grep "trustedCertEntry" | wc -l
$NEW_JDK/bin/keytool -list -keystore $NEW_JDK/jre/lib/security/cacerts -storepass changeit | grep "trustedCertEntry" | wc -l
# If you previously added internal CAs to old cacerts, import them into the new cacerts:
# Export from old:
$OLD_JDK/bin/keytool -exportcert -alias internal_enterprise_ca \
-keystore $OLD_JDK/jre/lib/security/cacerts -storepass changeit \
-file /tmp/internal_ca.der
# Import into new:
$NEW_JDK/bin/keytool -importcert -noprompt -alias internal_enterprise_ca \
-keystore $NEW_JDK/jre/lib/security/cacerts -storepass changeit \
-file /tmp/internal_ca.der
Phase 3: WebLogic Domain Environment Configuration
WebLogic resolves Java through two primary shell scripts: commEnv.sh and setDomainEnv.sh.
1. Update Common Environment (commEnv.sh)
Edit $ORACLE_HOME/oracle_common/common/bin/commEnv.sh:
# Backup script before modification
cp $ORACLE_HOME/oracle_common/common/bin/commEnv.sh \
$ORACLE_HOME/oracle_common/common/bin/commEnv.sh.bak.$(date +%F)
vi $ORACLE_HOME/oracle_common/common/bin/commEnv.sh
Locate the SUN_JAVA_HOME or JAVA_HOME declaration block and update the path:
# Update to target JDK directory
case "$JAVA_VENDOR" in
Oracle|Sun)
JAVA_HOME="/u01/app/oracle/product/java/jdk1.8.0_421"
;;
*)
JAVA_HOME="/u01/app/oracle/product/java/jdk1.8.0_421"
;;
esac
2. Update Domain Environment Script (setDomainEnv.sh)
Edit $DOMAIN_HOME/bin/setDomainEnv.sh for each affected domain (e.g., PeopleSoft PIA domain, Banner domain):
# Backup domain script
cp $DOMAIN_HOME/bin/setDomainEnv.sh \
$DOMAIN_HOME/bin/setDomainEnv.sh.bak.$(date +%F)
vi $DOMAIN_HOME/bin/setDomainEnv.sh
Locate the JAVA_HOME configuration section near the top of the file:
# Set new JDK path
SUN_JAVA_HOME="/u01/app/oracle/product/java/jdk1.8.0_421"
export SUN_JAVA_HOME
JAVA_HOME="/u01/app/oracle/product/java/jdk1.8.0_421"
export JAVA_HOME
Phase 4: Node Manager Reconfiguration
Node Manager runs as a persistent daemon. Managed servers started via Node Manager (or the WebLogic Admin Console) use the JDK specified in nodemanager.properties.
1. Update nodemanager.properties
Edit $DOMAIN_HOME/nodemanager/nodemanager.properties (or $ORACLE_HOME/user_projects/nodemanager/nodemanager.properties):
# Backup nodemanager.properties
# cp nodemanager.properties nodemanager.properties.bak
# Update JavaHome parameter
JavaHome=/u01/app/oracle/product/java/jdk1.8.0_421
2. Update systemd Service Unit (If Applicable)
If Node Manager is managed by a Linux systemd service unit (e.g., /etc/systemd/system/nodemanager.service):
[Unit]
Description=Oracle WebLogic Node Manager
After=network.target
[Service]
Type=simple
User=oracle
Group=oinstall
Environment="JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_421"
ExecStart=/u01/app/oracle/product/fmw12c/wlserver/server/bin/startNodeManager.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
Reload systemd daemon:
sudo systemctl daemon-reload
Phase 5: Rolling Zero-Downtime Restart Sequence
In a clustered environment (e.g., dual Managed Servers MS1 and MS2 behind an F5, Caddy, or Oracle HTTP Server load balancer), execute a rolling restart to eliminate end-user downtime:
[Load Balancer / OHS / Reverse Proxy]
| |
v v
[Managed Server 1] [Managed Server 2]
(Drain & Restart) (Active Traffic)
| |
v v
[Managed Server 1] [Managed Server 2]
(Active Traffic) (Drain & Restart)
Step 1: Restart Node Manager
Restarting Node Manager does not stop running Managed Servers.
# If using systemd:
sudo systemctl restart nodemanager.service
# Or if running standalone script:
$DOMAIN_HOME/bin/stopNodeManager.sh
nohup $DOMAIN_HOME/bin/startNodeManager.sh > $DOMAIN_HOME/nodemanager/nodemanager.out 2>&1 &
Verify Node Manager status:
tail -n 30 $DOMAIN_HOME/nodemanager/nodemanager.log | grep -E "Secure socket listener started|socket listener started"
Step 2: Restart WebLogic Administration Server
During Admin Server restart, running Managed Servers continue serving production HTTP/ERP requests without interruption.
# Gracefully stop Admin Server
$DOMAIN_HOME/bin/stopWebLogic.sh
# Confirm process has cleared
ps -ef | grep "weblogic.Server.*AdminServer" | grep -v grep || echo "Admin Server stopped cleanly."
# Start Admin Server with updated environment
nohup $DOMAIN_HOME/bin/startWebLogic.sh > $DOMAIN_HOME/servers/AdminServer/logs/AdminServer_boot.log 2>&1 &
Monitor startup log and verify the new JDK build:
tail -f $DOMAIN_HOME/servers/AdminServer/logs/AdminServer.log
Look for:
<Info> <WebLogicServer> <BEA-000377> <Starting WebLogic Server ...>
<Info> <WebLogicServer> <BEA-000378> <Java version: 1.8.0_421, Java VM: Java HotSpot(TM) 64-Bit Server VM>
<Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.>
Step 3: Rolling Restart of Clustered Managed Servers
For each Managed Server in the cluster:
- Mark Managed Server as Suspended / Drain Connections:
Using WebLogic Scripting Tool (WLST) or Admin Console, gracefully stop or suspend traffic to
MS1. - Stop Managed Server:
$DOMAIN_HOME/bin/stopManagedWebLogic.sh MS1 t3://adminhost:7001 - Start Managed Server under New JDK:
nohup $DOMAIN_HOME/bin/startManagedWebLogic.sh MS1 t3://adminhost:7001 > $DOMAIN_HOME/servers/MS1/logs/MS1_boot.log 2>&1 & - Verify Health and Re-enable Traffic:
Confirm state returns to
RUNNINGand health isHEALTH_OK. - Repeat for
MS2,MS3, etc.
Phase 6: Post-Upgrade Verification Checklist
Run these commands to prove that all domain processes are running exclusively on the new JDK:
# 1. Verify every active WebLogic process is executing the new Java binary
ps -ef | grep weblogic.Server | awk '{print $2}' | while read pid; do
echo "PID: $pid -> $(ls -l /proc/$pid/exe | awk '{print $11}')"
done
# 2. Check for SSL/TLS handshakes or certificate trust errors in server logs
grep -iE "BEA-090402|BEA-090034|CertificateException|HandshakeFailed" \
$DOMAIN_HOME/servers/*/logs/*.log || echo "Zero SSL/TLS handshake errors detected."
# 3. Verify Node Manager communication via WLST
cat << 'EOF' > /tmp/test_nm.py
connect('weblogic', 'YourPassword', 't3://adminhost:7001')
nmConnect('nodemanager', 'NMPassword', 'localhost', '5556', 'base_domain')
print "--> Node Manager connection SUCCESSFUL."
disconnect()
exit()
EOF
$DOMAIN_HOME/bin/wlst.sh /tmp/test_nm.py
rm -f /tmp/test_nm.py
Deterministic Rollback Procedure
If an application incompatibility is discovered post-restart:
- Restore Environment Scripts:
cp $DOMAIN_HOME/bin/setDomainEnv.sh.bak.* $DOMAIN_HOME/bin/setDomainEnv.sh cp $ORACLE_HOME/oracle_common/common/bin/commEnv.sh.bak.* $ORACLE_HOME/oracle_common/common/bin/commEnv.sh - Restore Node Manager:
sed -i 's|jdk1.8.0_421|jdk1.8.0_391|g' $DOMAIN_HOME/nodemanager/nodemanager.properties sudo systemctl restart nodemanager.service - Execute Rolling Restart: Restart Admin Server and Managed Servers following Phase 5. The cluster reverts to the previous working JDK in minutes without data loss.
📚 Technical References
- Oracle WebLogic Server Managing Server Startup and Shutdown — Official Node Manager configuration parameters.
- Oracle Critical Patch Updates & Java SE Risk Matrix — Quarterly security alerts and vulnerability mitigation.
- Oracle Fusion Middleware Supported System Configurations — Official Java SE certification matrices.