2016-04-14 23 views
0

Ich habe eine grundlegende Maven Java-App, die ich erstellt habe und es hängt von JeroMQ, die eine vollständige Java-Implementierung von ZeroMQ ist. Da ich brauche diese Java-Anwendung als Windows-Dienst wickeln auch, wählte ich Apache Commons Daemon zu verwenden und anschließend gesagt, dieses ausgezeichnete Beispiel: http://web.archive.org/web/20090228071059/http://blog.platinumsolutions.com/node/234 Hier was aussieht wie der Java-Code ist:java.lang.ClassNotFoundException: org.zeromq.ZContext beim Versuch, Windows-Dienst zu starten

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(); 
     } 
    } 
} 

Dann habe ich die folgende Ordnerstruktur wie das Tutorial vorgeschlagen:

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

ich dann in das Verzeichnis ist navigiert und folgenden Befehl, um den Dienst zu installieren:

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 

Die Installation funktioniert einwandfrei, da ich sie in Windows Services sehen kann. Wenn ich versuche, es von dort aus zu starten, erhalte ich die Fehlermeldung "Windows kann die SubscriberACD auf dem lokalen Computer nicht starten".

ich die Fehlerprotokolle überprüft und den folgenden Eintrag sehen:

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 

Es ist erwähnenswert, dass JeroMQ ist derzeit ein Glas unter meiner Maven Abhängigkeit. Ich habe es aus meiner POM.xml-Datei konfiguriert.

Ich denke, das Problem könnte sein, dass mein Dienst keinen Zugriff auf das JeroMQ-Jar hat, das sich unter meinen Maven-Abhängigkeiten befindet. Meine Annahme ist, dass die Klassendatei die Abhängigkeiten nicht enthält. Also, was ich versuchte, wurde meine gesamte Projekt als ein Glas zu exportieren und steckte das Baby unter E:\SubscriberACD\classes\ Also meine Struktur sieht nun wie folgt aus:

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

jedoch, dass nicht das Problem zu beheben haben. Kann jemand etwas Licht dazu bringen?

Antwort

1

zu Ihrem --Classpath Argument ändern:

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

Sie haben mit ziemlicher Sicherheit andere jarfiles Sie benötigen, so hängen Sie sie einfach an das Ende des --Classpath verwendet wird; (Semikolon) Trennzeichen ...

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

Danke, funktioniert wie ein Charme! Was ich tat, war, dass ich den Pfad zu dem Jar verwendete, den ich aka Subscriber.jar erstellt hatte, und dann habe ich die JAR-Datei für JeroMQ angehängt, die in meinen Abhängigkeiten aka jeromq-0.3.5.jar war. Natürlich musste ich herausfinden, wo Eclipse diese Jar-Datei speicherte und dann dieses Jar kopieren, um unter E: \ SubscriberACD \ classes zu leben – SpartaSixZero