【问题标题】:The system cannot find the file specified while starting a windows service from a Java App using Apache Commons Daemon使用 Apache Commons Daemon 从 Java 应用程序启动 Windows 服务时系统找不到指定的文件
【发布时间】:2016-04-16 20:05:14
【问题描述】:

我的 Java 应用程序有以下来自 Eclipse 的文件结构,我使用 Apache Commons Daemon 将其转换为 Windows 服务。

SubscriberACD
    /Maven Dependencies
    /src/main/java
        /org.SubscriberACD
            /Subscriber.java
    /src/test/java
    /JRE System Librar
    /src
    /target
    config.xml
    pom.xml

在 Subscriber.java 中,这里是定义字符串的地方:

    private static final String CONFIG_FILE = "config.xml";

这里是从 xml 文件中读取的代码 sn-p(基于这篇文章:Java: How to read and write xml files?):

   Document document;
   DocumentBuilderFactory doc_builder_factory = DocumentBuilderFactory.newInstance();

   try {
       DocumentBuilder doc_builder = doc_builder_factory.newDocumentBuilder();
       document = doc_builder.parse(CONFIG_FILE);

我的服务文件目录如下所示:

E:\SubscriberACD
     \bin
        \subscriberACD.exe
        \subscriberACDw.exe
     \classes
        \org
           \SubscriberACD
               \Subscriber.class
               \config.xml
        \3rdpartyjarfiles
        \SubscriberACD.jar
     \logs

请注意我是如何将 config.xml 卡在 SubscriberACD 下的类下的,只是为了尝试一下。但它没有用。另外值得注意的是,我还将我的项目导出为 SubscriberACD.jar 并将其放在 \classes 文件夹下。从 Eclipse 来看,config.xml 似乎也被打包在该 jar 中。尝试启动 Windows 服务时出现以下错误:

2016-04-16 15:08:27 Commons Daemon procrun stderr initialized
Exception in thread "main" n\config.xml (The system cannot find the file specified)
java.lang.NumberFormatException: For input string: "null"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at zmq.TcpAddress.resolve(TcpAddress.java:105)
    at zmq.Address.resolve(Address.java:98)
    at zmq.SocketBase.connect(SocketBase.java:510)
    at org.zeromq.ZMQ$Socket.connect(ZMQ.java:1246)
    at org.SubscriberACD.Subscriber.start(Subscriber.java:114)
    at org.SubscriberACD.Subscriber.windowsService(Subscriber.java:61)

我是否遗漏了一些额外的配置?

【问题讨论】:

    标签: java apache-commons-daemon


    【解决方案1】:

    试试这个: 将文件config.xml直接放到classes文件夹中:

    E:\SubscriberACD\classes\config.xml
    

    然后在 Subscriber.java 中尝试像这样加载文件:

    Document document;
    DocumentBuilderFactory doc_builder_factory = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder doc_builder = doc_builder_factory.newDocumentBuilder();
        try(InputStream instream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.xml")) {
            document = doc_builder.parse(instream);
        }
    } catch(SAXException | ParserConfigurationException e) {
        throw new RuntimeException(e);
    }
    

    【讨论】:

      【解决方案2】:

      (Eclipse)创建一个源文件夹并将“config.xml”粘贴到里面。

      InputStream is = getClass().getClassLoader().getResourceAsStream("config.xml");
      

      使用is (InputStream)解析

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-21
        • 1970-01-01
        • 2013-11-16
        相关资源
        最近更新 更多