weblogic-maven-plugin:list-apps通过管理端口调用时抛空指针异常
我之前也碰到过WebLogic 12.1.3 Maven插件在T3s连接下的类似NPE问题,结合官方文档和实际调试,给你整理了针对性的解决方案,同时帮你实现包含旧版本清理的自动化部署流程:
一、修复list-apps的NullPointerException
这个NPE大概率是SSL连接后插件获取应用状态时的对象初始化失败导致的,你可以按以下步骤排查修复:
验证SSL配置的完整性
首先确认JVM参数里的信任库配置完全正确:-Djavax.net.ssl.trustStore=/path/to/your/truststore.jks -Djavax.net.ssl.trustStorePassword=your-truststore-password确保信任库中确实导入了WebLogic管理服务器的SSL证书。如果暂时不想处理证书主机名匹配问题,可以临时添加
-Dweblogic.security.SSL.ignoreHostnameVerification=true跳过验证,要是这样NPE消失了,就说明是证书的主机名和实际服务器不匹配,需要重新生成对应域名的证书。补全WebLogic客户端依赖
12.1.3的weblogic-maven-plugin本身依赖的客户端jar可能不全,导致SSL连接后无法正确解析应用状态。你可以在pom.xml中添加完整的wlfullclient依赖:<dependency> <groupId>com.oracle.weblogic</groupId> <artifactId>wlfullclient</artifactId> <version>12.1.3-0-0</version> <scope>provided</scope> </dependency>添加后重新执行
weblogic:list-apps,很多时候这个依赖补全就能解决NPE问题。调整插件配置参数
在插件的configuration里明确指定secure=true和对应的SSL协议,避免插件使用默认的旧协议导致异常:<plugin> <groupId>com.oracle.weblogic</groupId> <artifactId>weblogic-maven-plugin</artifactId> <version>12.1.3-0-0</version> <configuration> <adminurl>t3s://your-host:your-admin-port</adminurl> <user>your-admin-user</user> <password>your-admin-pass</password> <secure>true</secure> <sslProtocol>TLSv1.2</sslProtocol> <!-- 12.1.3推荐使用TLSv1.2 --> </configuration> </plugin>
二、实现包含旧版本清理的自动化部署流程
既然Purge任务无法处理退役状态的旧应用,我们可以结合Maven插件和WLST脚本实现完整流程:
1. 分发应用并以管理员模式启动
用weblogic:deploy目标指定adminMode=true,确保只有管理员能访问:
mvn weblogic:deploy -Dadminurl=t3s://host:adminport -Duser=admin -Dpassword=your-pass -Dsource=target/your-app.war -Dname=your-app -DadminMode=true
2. 执行应用测试
可以用Maven Surefire插件跑集成测试,或者用curl调用应用的健康检查接口,确保应用功能正常。
3. 正式启动应用或卸载回滚
- 测试通过后,退出管理员模式启动应用:
mvn weblogic:start-app -Dadminurl=t3s://host:adminport -Duser=admin -Dpassword=your-pass -Dname=your-app - 测试失败则直接卸载:
mvn weblogic:undeploy -Dadminurl=t3s://host:adminport -Duser=admin -Dpassword=your-pass -Dname=your-app
4. 自动清理退役状态的旧版本
编写WLST脚本purge-retired-apps.py来查询并删除退役应用:
connect('admin-user', 'admin-pass', 't3s://host:adminport') domainRuntime() appRuntimes = cmo.getAppRuntimeMBeans() for app in appRuntimes: appId = app.getApplicationIdentifier() appState = app.getState() # WebLogic中退役状态对应的字符串是'RETIRED',常量值为3 if appState == 'RETIRED' or appState == 3: print(f"清理退役应用: {appId}") undeploy(appId, retireTimeout=0) disconnect() exit()
然后在pom.xml中配置exec-maven-plugin,在部署流程的最后执行这个脚本:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>purge-retired-apps</id> <phase>post-integration-test</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>${java.home}/bin/java</executable> <arguments> <argument>-Djavax.net.ssl.trustStore=/path/to/truststore.jks</argument> <argument>-Djavax.net.ssl.trustStorePassword=truststore-pass</argument> <argument>-cp</argument> <argument>${wl.home}/server/lib/wlfullclient.jar:${wl.home}/server/lib/wlst.jar</argument> <argument>weblogic.WLST</argument> <argument>purge-retired-apps.py</argument> </arguments> </configuration> </execution> </executions> </plugin>
记得在pom.xml中定义${wl.home}为你的WebLogic安装路径,比如:
<properties> <wl.home>/opt/oracle/wls1213</wl.home> </properties>
内容的提问来源于stack exchange,提问作者Legenyanya

