2016-04-14 24 views
0

Oluşturduğum temel bir Maven java uygulamasına sahibim ve bu, ZeroMQ'nun tam bir Java implemenetasyonu olan JeroMQ'ya bağlı. Ben de bir windows hizmeti olarak bu java uygulaması sarmak gerekir beri, Apache Commons Daemon kullanmayı seçti ve özellikle bu mükemmel örneğini takip: Burada http://web.archive.org/web/20090228071059/http://blog.platinumsolutions.com/node/234 gibi Java kodu görünüyor: benim yarattığım Sonrajava.lang.ClassNotFoundException: org.zeromq.ZContext, Windows hizmetini başlatmaya çalışırken

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

aşağıdaki öğretici önerdi tıpkı klasör yapısı:

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

sonra bin dizinine navigasyon ve hizmet yüklemek için aşağıdaki komutu yayınladı:

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 

Yükleme, Windows Services'de görebildiğim için iyi çalışıyor. Ancak, oradan başlatmak çalıştığınızda, "Windows, yerel bilgisayarda SubscriberACD başlatılamıyor" diyerek bir hata alıyorum.

hata kayıtlarını kontrol ettik ve şu girişe bakın:

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 

Bu JeroMQ anda benim Maven'in Bağımlılıklar altında bir kavanoz olduğunu belirtmek gerekir. POM.xml dosyasından yapılandırdım.

Sorunun, hizmetimin Maven Bağımlılıklarım altındaki JeroMQ jarma erişemediği olabileceğini düşünüyorum. Benim varsayımım, sınıf dosyasının bağımlılıkları içermemesidir. Yani ne bir kavanoza olarak benim tüm projeyi ihraç edildi denenmiş ve E:\SubscriberACD\classes\ altında Bebeği sıkışmış Yani benim yapısı şimdi şöyle görünür:

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

Ancak sorunu gidermek vermedi. Bu konuda biraz ışık tutabilir mi?

cevap

1
için --Classpath argüman değiştirin

:

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

Neredeyse kesinlikle bu yüzden sadece kullanarak --Classpath sonuna bunları eklemek, gerekir diğer jarfiles var; (yarı-kolon) sınırlayıcılar ...

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

Teşekkürler, bir çekicilik gibi çalışır! Ne yaptım ben aka Subscriber.jar oluşturdu ve sonra benim bağımlılıkları aka jeromq-0.3.5.jar bağımlı oldu JeroMQ için jar dosyası ekledi. Elbette, Eclipse'in bu kavanoz dosyasını nerede sakladığını bulup o kavanozu E: \ SubscriberACD \ class altında yaşayabilmek için buldum. – SpartaSixZero

İlgili konular