从Ubuntu通过winrm4j远程执行Windows PowerShell脚本报错求助
问题
我使用Java库winrm4j从Ubuntu机器远程执行Windows机器上的PowerShell命令或脚本,代码在本地Windows机器或Eclipse中运行正常,但打包成JAR放到Ubuntu机器上运行时,持续出现NullPointerException错误。
代码实现
WinRmToolResponse resp = null; try { WinRmClientContext context = WinRmClientContext.newInstance(); WinRmTool tool = WinRmTool.Builder.builder("<window-hostname>", user, pass) .authenticationScheme(AuthSchemes.NTLM) .disableCertificateChecks(true) .port(5985) .useHttps(false) .context(context) .build(); resp = tool.executePs("Get-Date"); System.out.println(resp.getStatusCode()); System.out.println(resp.getStdOut()); System.out.println(resp.getStdErr()); context.shutdown(); } catch (Exception e) { System.out.println("Error in running powershell script"); e.printStackTrace(); }
错误日志
0 [main] INFO org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean - Creating Service {http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd}WinRmService from WSDL: jar:file:/home/ubuntu/demo2-0.0.1-SNAPSHOT.jar!/wsdl/WinRmService.wsdl 6 [main] WARN io.cloudsoft.winrm4j.client.WinRmClient - Error creating WinRm service with mbean strategy (trying other strategies): java.lang.NullPointerException java.lang.NullPointerException at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:393) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:527) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:262) at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199) at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:103) at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91) at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:159) at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142) at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:95) at io.cloudsoft.winrm4j.client.WinRmFactory.doCreateServiceWithBean(WinRmFactory.java:140) at io.cloudsoft.winrm4j.client.WinRmFactory.createService(WinRmFactory.java:44) at io.cloudsoft.winrm4j.client.WinRmFactory.newInstance(WinRmFactory.java:32) at io.cloudsoft.winrm4j.client.WinRmClient.getService(WinRmClient.java:244) at io.cloudsoft.winrm4j.client.WinRmClient.<init>(WinRmClient.java:220) at io.cloudsoft.winrm4j.client.WinRmClientBuilder.build(WinRmClientBuilder.java:285) at io.cloudsoft.winrm4j.winrm.WinRmTool.executeCommand(WinRmTool.java:396) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:422) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:413) at PowershellTester.main(PowershellTester.java:58) 18 [main] WARN io.cloudsoft.winrm4j.client.WinRmClient - Error creating WinRm service with reflective delegate (trying other strategies): java.lang.NullPointerException java.lang.NullPointerException at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85) at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:217) at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:160) at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:128) at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82) at javax.xml.ws.Service.<init>(Service.java:77) at io.cloudsoft.winrm4j.client.WinRmService.<init>(WinRmService.java:44) at io.cloudsoft.winrm4j.client.WinRmFactory.doCreateService_1_CreateMinimalServiceInstance(WinRmFactory.java:144) at io.cloudsoft.winrm4j.client.WinRmFactory.doCreateServiceWithReflectivelySetDelegate(WinRmFactory.java:86) at io.cloudsoft.winrm4j.client.WinRmFactory.createService(WinRmFactory.java:61) at io.cloudsoft.winrm4j.client.WinRmFactory.newInstance(WinRmFactory.java:32) at io.cloudsoft.winrm4j.client.WinRmClient.getService(WinRmClient.java:244) at io.cloudsoft.winrm4j.client.WinRmClient.<init>(WinRmClient.java:220) at io.cloudsoft.winrm4j.client.WinRmClientBuilder.build(WinRmClientBuilder.java:285) at io.cloudsoft.winrm4j.winrm.WinRmTool.executeCommand(WinRmTool.java:396) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:422) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:413) at PowershellTester.main(PowershellTester.java:58) 21 [main] WARN io.cloudsoft.winrm4j.client.WinRmClient - Error creating WinRm service with many strategies (giving up): java.lang.NullPointerException java.lang.NullPointerException at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85) at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:217) at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:160) at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:128) at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82) at javax.xml.ws.Service.<init>(Service.java:77) at io.cloudsoft.winrm4j.client.WinRmService.<init>(WinRmService.java:44) at io.cloudsoft.winrm4j.client.WinRmFactory.doCreateService_1_CreateMinimalServiceInstance(WinRmFactory.java:144) at io.cloudsoft.winrm4j.client.WinRmFactory.doCreateServiceNormal(WinRmFactory.java:79) at io.cloudsoft.winrm4j.client.WinRmFactory.createService(WinRmFactory.java:68) at io.cloudsoft.winrm4j.client.WinRmFactory.newInstance(WinRmFactory.java:32) at io.cloudsoft.winrm4j.client.WinRmClient.getService(WinRmClient.java:244) at io.cloudsoft.winrm4j.client.WinRmClient.<init>(WinRmClient.java:220) at io.cloudsoft.winrm4j.client.WinRmClientBuilder.build(WinRmClientBuilder.java:285) at io.cloudsoft.winrm4j.winrm.WinRmTool.executeCommand(WinRmTool.java:396) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:422) at io.cloudsoft.winrm4j.winrm.WinRmTool.executePs(WinRmTool.java:413) at PowershellTester.main(PowershellTester.java:58)
依赖配置
implementation group: 'io.cloudsoft.windows', name: 'winrm4j', version: '0.12.3'
解决方案
这个问题根源是Ubuntu环境下缺少CXF依赖的XML解析组件,或者打包时未包含winrm4j所需的WSDL资源文件,可按以下步骤修复:
调整打包逻辑,确保资源文件被包含
在build.gradle中修改jar打包配置,将所有依赖的资源(包括WSDL文件)都打包进JAR:jar { from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } manifest { attributes 'Main-Class': '你的主类全限定名' } }补充CXF相关依赖
手动添加CXF核心依赖,避免环境缺失必要组件:implementation 'org.apache.cxf:cxf-rt-frontend-jaxws:3.6.2' implementation 'org.apache.cxf:cxf-rt-transports-http:3.6.2' implementation 'org.apache.cxf:cxf-rt-ws-security:3.6.2' implementation 'org.apache.ws.security:wss4j:2.4.1'检查并调整JVM环境
Ubuntu默认JVM的XML解析器可能与CXF兼容性差,可切换至完整版本的OpenJDK或Oracle JDK,确保XML相关类库完整。修复NTLM认证依赖(可选)
若使用NTLM认证,在Ubuntu机器上安装libntlm0库:sudo apt-get install libntlm0也可尝试将认证方式切换为Kerberos,减少跨平台依赖问题。
内容的提问来源于stack exchange,提问作者sensitive_piece_of_horseflesh
相关产品推荐
相关产品推荐

