2017-07-24 106 views
1

我想實現一個簡單的代碼來從超聲波中讀取數據並通過使用Californium將其發送到服務器。問題是,當我使用調試時,它沒有任何錯誤。然而,當我的代碼導出到一個可運行jar文件,並在我的覆盆子PI運行它,它會引發以下錯誤:由java.lang.NoClassDefFoundError和ClassNotFoundException導致的錯誤

Exception in thread "main" java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.NoClassDefFoundError: org/eclipse/californium/elements/util/NamedThreadFactory 
at org.eclipse.californium.core.CoapServer.<init>(CoapServer.java:163) 
at org.eclipse.californium.core.CoapServer.<init>(CoapServer.java:120) 
at iot.main.device.DeviceClient.main(DeviceClient.java:34) 
... 5 more 
Caused by: java.lang.ClassNotFoundException: org.eclipse.californium.elements.util.NamedThreadFactory 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
... 8 more 

我不知道是什麼原因導致這個問題以及如何解決它,任何的建議是多很有幫助。下面是代碼:

package iot.main.device; 

import static org.eclipse.californium.core.coap.CoAP.ResponseCode.BAD_REQUEST; 
import static org.eclipse.californium.core.coap.CoAP.ResponseCode.CHANGED; 

import org.eclipse.californium.core.CoapClient; 
import org.eclipse.californium.core.CoapResource; 
import org.eclipse.californium.core.CoapResponse; 
import org.eclipse.californium.core.CoapServer; 
import org.eclipse.californium.core.coap.MediaTypeRegistry; 
import org.eclipse.californium.core.server.resources.CoapExchange; 

import com.pi4j.io.gpio.*; 


public class DeviceClient { 


private static GpioPinDigitalOutput sensorTriggerPin ; 
private static GpioPinDigitalInput sensorEchoPin ; 

final static GpioController gpio = GpioFactory.getInstance(); 

public static void main(String[] args) { 


    double ultraVal; 

    sensorTriggerPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04); // Trigger pin as OUTPUT 
    sensorEchoPin = gpio.provisionDigitalInputPin(RaspiPin.GPIO_05,PinPullResistance.PULL_DOWN); // Echo pin as INPUT 

    CoapClient client = new CoapClient("coap://localhost/Ultrasonic"); 

    CoapServer server = new CoapServer(); 
    server.add(new UltraResource()); 
    server.start(); 

    while(true){ 
     try { 
     Thread.sleep(2000); 
     sensorTriggerPin.high(); // Make trigger pin HIGH 
     Thread.sleep((long) 0.00001);// Delay for 10 microseconds 
     sensorTriggerPin.low(); //Make trigger pin LOW 

     while(sensorEchoPin.isLow()){ //Wait until the ECHO pin gets HIGH 

     } 
     long startTime= System.nanoTime(); // Store the surrent time to calculate ECHO pin HIGH time. 
     while(sensorEchoPin.isHigh()){ //Wait until the ECHO pin gets LOW 

     } 
     long endTime= System.nanoTime(); // Store the echo pin HIGH end time to calculate ECHO pin HIGH time. 

     ultraVal = ((((endTime - startTime)/1e3)/2)/29.1); 
     System.out.println("Distance : " + ultraVal + " cm"); //Printing out the distance in cm 
     Thread.sleep(1000); 

     CoapResponse response = client.put(Double.toString(ultraVal), MediaTypeRegistry.TEXT_PLAIN); 

     if (response!=null) { 

      System.out.println(response.getCode()); 
      System.out.println(response.getOptions()); 
      System.out.println(response.getResponseText()); 

     } else { 

      System.out.println("Request failed"); 

     } 



     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 


    } 

} 

public static class UltraResource extends CoapResource { 

    public String value = "Resource has not changed yet !!!"; 

    public UltraResource() { 
     super("Ultrasonic"); 
     setObservable(true); 
    } 

    @Override 
    public void handleGET(CoapExchange exchange) { 
     exchange.respond(value); 

    } 


    @Override 
    public void handlePUT(CoapExchange exchange) { 
     String payload = exchange.getRequestText(); 
     System.out.println(payload + " cm"); 

     try { 
      exchange.respond(CHANGED, payload); 
      value = new String(payload); 
      changed(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      exchange.respond(BAD_REQUEST, "Invalid String"); 
     } 
    } 
} 

}

回答

0

的錯誤指出

Caused by: java.lang.ClassNotFoundException: org.eclipse.californium.elements.util.NamedThreadFactory 

這意味着你要編寫一個使用從鐦依賴代碼。這種依賴性在你的開發中。環境,但它不在Raspberry Pi的運行時環境中。

看看這個other post哪些可以幫到你。此SO網站可能會更好。

+0

感謝您的幫助,但我沒有看到您提到的帖子可以幫助我解決這個問題。另外,如何通過簡單地複製jar文件來在我的raspi運行環境中添加californium的依賴關係?當我選擇導出jar文件時,有一個選項可以將所需的庫包含到生成的jar文件中,我認爲它已經可以做到這一點了? – dondon

+0

不知道後者,但通常你會做前者,並確保你的類路徑設置正確 –

+0

所以我試圖將DeviceClient.java及其依賴文件夾DeviceClient_lib複製到我的raspi並運行命令java -cp DeviceClient.jar: home/pi/DeviceClient_lib/* DeviceClient.UltrasonicRaspi(UltrasonicRaspi是我的主類),但它仍然拋出這些例外。 – dondon