Системе не удается найти указанный файл при запуске службы Windows из приложения Java с помощью демона Apache Commons.

У меня есть следующая файловая структура из Eclipse для моего Java-приложения, которое я превратил в службу Windows с помощью Apache Commons Daemon.

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 (на основе этого сообщения: Java: как читать и записывать xml-файлы?):

   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 также упаковывается в эту банку. Я получаю следующую ошибку, когда пытаюсь запустить службу 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)

Была ли какая-то дополнительная конфигурация, которую я пропустил?


person SpartaSixZero    schedule 16.04.2016    source источник


Ответы (2)


Попробуйте следующее: поместите файл config.xml прямо в папку классов:

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);
}
person David    schedule 16.04.2016

(Eclipse) создайте исходную папку и вставьте внутрь «config.xml».

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

Разобрать с помощью is (InputStream)

person Mystic    schedule 16.04.2016