使用 Apache Commons Daemon 从 Java 应用程序启动 windows 服务时,系统找不到指定的文件
The system cannot find the file specified while starting a windows service from a Java App using Apache Commons Daemon
我的 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 文件中读取的代码片段(基于此 post: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
rdpartyjarfiles
\SubscriberACD.jar
\logs
请注意我是如何将 config.xml 卡在 类 下的 SubscriberACD 下的,只是为了尝试一下。但它没有用。另外值得注意的是,我还将我的项目导出为 SubscriberACD.jar 并将其放在 \类 文件夹下。从 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)
我是否遗漏了一些额外的配置?
(Eclipse) 制作一个源文件夹并将 "config.xml" 粘贴到里面。
InputStream is = getClass().getClassLoader().getResourceAsStream("config.xml");
使用 is (InputStream)
解析
试试这个:
将文件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);
}
我的 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 文件中读取的代码片段(基于此 post: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
rdpartyjarfiles
\SubscriberACD.jar
\logs
请注意我是如何将 config.xml 卡在 类 下的 SubscriberACD 下的,只是为了尝试一下。但它没有用。另外值得注意的是,我还将我的项目导出为 SubscriberACD.jar 并将其放在 \类 文件夹下。从 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)
我是否遗漏了一些额外的配置?
(Eclipse) 制作一个源文件夹并将 "config.xml" 粘贴到里面。
InputStream is = getClass().getClassLoader().getResourceAsStream("config.xml");
使用 is (InputStream)
解析试试这个: 将文件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);
}