2016-04-14 5 views
0

У меня есть базовое приложение Java Maven, которое я создал, и это зависит от JeroMQ, который является полной реализацией Java ZeroMQ. Так как я тоже нужно обернуть это Java приложение в качестве службы Windows, я решил использовать Apache Commons Daemon и, в частности, за этот прекрасный пример: http://web.archive.org/web/20090228071059/http://blog.platinumsolutions.com/node/234 Вот что код Java выглядит следующим образом:java.lang.ClassNotFoundException: org.zeromq.ZContext при попытке запустить службу Windows

package com.org.SubscriberACD; 

import java.nio.charset.Charset; 

import org.zeromq.ZContext; 
import org.zeromq.ZMQ; 
import org.zeromq.ZMQ.Socket; 

/** 
* JeroMQ Subscriber for Apache Commons Daemon 
* 
*/ 
public class Subscriber 
{ 
    /** 
    * Single static instance of the service class 
    */ 
    private static Subscriber subscriber_service = new Subscriber(); 

    /** 
    * Static method called by prunsrv to start/stop 
    * the service. Pass the argument "start" 
    * to start the service, and pass "stop" to 
    * stop the service. 
    */ 
    public static void windowsService(String args[]) { 
     String cmd = "start"; 
     if(args.length > 0) { 
      cmd = args[0]; 
     } 

     if("start".equals(cmd)) { 
      subscriber_service.start(); 
     } 
     else { 
      subscriber_service.stop(); 
     } 
    } 

    /** 
    * Flag to know if this service 
    * instance has been stopped. 
    */ 
    private boolean stopped = false; 


    /** 
    * Start this service instance 
    */ 
    public void start() { 

     stopped = false; 

     System.out.println("My Service Started " 
          + new java.util.Date()); 

     ZContext context = new ZContext(); 

     Socket subscriber = context.createSocket(ZMQ.SUB); 
     subscriber.connect("tcp://localhost:5556"); 
     String subscription = "MySub"; 
     subscriber.subscribe(subscription.getBytes(Charset.forName("UTF-8"))); 

     while(!stopped) { 
      System.out.println("My Service Executing " 
           + new java.util.Date()); 

      String topic = subscriber.recvStr(); 
      if (topic == null) 
       break; 
      String data = subscriber.recvStr(); 
      assert(topic.equals(subscription)); 
      System.out.println(data); 

      synchronized(this) { 
      try { 
       this.wait(60000); // wait 1 minute 
      } 
      catch(InterruptedException ie){} 
      } 
     } 

     subscriber.close(); 
     context.close(); 
     context.destroy(); 

     System.out.println("My Service Finished " 
          + new java.util.Date()); 
    } 

    /** 
    * Stop this service instance 
    */ 
    public void stop() { 
     stopped = true; 
     synchronized(this) { 
      this.notify(); 
     } 
    } 
} 

Затем я создал следующее структура папок так же, как учебник предложил:

E:\SubscriberACD 
    \bin 
     \subscriberACD.exe 
     \subscriberACDw.exe 
    \classes 
     \com\org\SubscriberACD\Subscriber.class 
    \logs 

Я тогда переходите в каталог бен и выдал следующую команду, чтобы установить службу:

subscriberACD.exe //IS//SubscriberACD --Install=E:\SubscriberACD\bin\subscriberACD.exe --Descriptio 
n="Subscriber using Apache Commons Daemon" --Jvm=c:\glassfish4\jdk7\jre 
\bin\server\jvm.dll --Classpath=E:\SubscriberACD\classes --StartMode=jvm 
--StartClass=com.org.SubscriberACD.Subscriber --StartMethod=windowsSer 
vice --StartParams=start --StopMode=jvm --StopClass=com.org.SubscriberA 
CD.Subscriber --StopMethod=windowsService --StopParams=stop --LogPath=E:\SubscriberACD\logs --StdOutput=auto --StdError=auto 

Установка работает отлично, так как я вижу ее в Windows Services. Однако, когда я пытаюсь запустить его оттуда, я получаю сообщение об ошибке «Windows не может запустить SubscriberACD на локальном компьютере».

Я проверил журналы ошибок и смотрите следующую запись:

2016-04-14 14:38:40 Commons Daemon procrun stderr initialized 
Exception in thread "main" ror: org/zeromq/ZContext 
    at com.org.SubscriberACD.Subscriber.start(Subscriber.java:57) 
    at com.org.SubscriberACD.Subscriber.windowsService(Subscriber.java:33) 
Caused by: java.lang.ClassNotFoundException: org.zeromq.ZContext 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 2 more 

Стоит отметить, что в настоящее время JeroMQ баночка под моими зависимостями Maven. Я настроил его из моего файла POM.xml.

Я думаю, проблема может заключаться в том, что моя служба не имеет доступа к JarMQ jar, которая находится под моими зависимостями Maven. Мое предположение состоит в том, что файл класса не содержит зависимостей. Так что я пытался экспортировал весь мой проект в баночку и застрял, что ребенок под E:\SubscriberACD\classes\ Так моя структура теперь выглядит следующим образом:

E:\SubscriberACD 
    \bin 
     \subscriberACD.exe 
     \subscriberACDw.exe 
    \classes 
     \com\org\SubscriberACD\ 
      \Subscriber.class 
     \Subscriber.jar 
    \logs 

Однако, это не исправить эту проблему. Может кто-нибудь пролить некоторый свет на это?

ответ

1

Изменить --Classpath аргумент:

--Classpath=E:\SubscriberACD\classes\your-jar-filename.jar 

Вы почти наверняка есть другие jarfiles вам нужно, так что просто добавить их к концу --Classpath использованием; (с запятой) ...

--Classpath=E:\SubscriberACD\classes\your-jar-filename.jar;e:\other-dir\classes\some-other.jar;etc... 
+0

Спасибо, работает как очарование! То, что я сделал, я использовал путь к банке, которую создал aka Subscriber.jar, а затем я добавил файл jar для JeroMQ, который был в моих зависимостях aka jeromq-0.3.5.jar. Конечно, мне пришлось найти, где Eclipse хранит этот файл jar, а затем скопировать эту банку, чтобы жить под E: \ SubscriberACD \ classes – SpartaSixZero

Смежные вопросы