You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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资源文件,可按以下步骤修复:

  1. 调整打包逻辑,确保资源文件被包含
    在build.gradle中修改jar打包配置,将所有依赖的资源(包括WSDL文件)都打包进JAR:

    jar {
        from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
        manifest {
            attributes 'Main-Class': '你的主类全限定名'
        }
    }
    
  2. 补充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'
    
  3. 检查并调整JVM环境
    Ubuntu默认JVM的XML解析器可能与CXF兼容性差,可切换至完整版本的OpenJDK或Oracle JDK,确保XML相关类库完整。

  4. 修复NTLM认证依赖(可选)
    若使用NTLM认证,在Ubuntu机器上安装libntlm0库:

    sudo apt-get install libntlm0
    

    也可尝试将认证方式切换为Kerberos,减少跨平台依赖问题。

内容的提问来源于stack exchange,提问作者sensitive_piece_of_horseflesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:22:02