Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoClassDefFoundError:com/pi4j/io/I2CFactory$UnsupportedBunsumberException_Java_Raspberry Pi3_I2c_Pi4j - Fatal编程技术网

Java NoClassDefFoundError:com/pi4j/io/I2CFactory$UnsupportedBunsumberException

Java NoClassDefFoundError:com/pi4j/io/I2CFactory$UnsupportedBunsumberException,java,raspberry-pi3,i2c,pi4j,Java,Raspberry Pi3,I2c,Pi4j,我试图在Raspberry Pi model 3上运行java代码,该模型是从PC eclipse开发环境下载的,用于使用pi4j库访问I2C总线上的9DoF设备。我得到以下错误: java-classpath.:classes:/opt/pi4j/lib/'*'-jar/home/pi /artifacts/RPITank-1.0-SNAPSHOT.jar错误:发生JNI错误, 请检查您的安装并在线程中重试异常 “main”java.lang.NoClassDefFoundError:com/

我试图在Raspberry Pi model 3上运行java代码,该模型是从PC eclipse开发环境下载的,用于使用pi4j库访问I2C总线上的9DoF设备。我得到以下错误:


java-classpath.:classes:/opt/pi4j/lib/'*'-jar/home/pi
/artifacts/RPITank-1.0-SNAPSHOT.jar错误:发生JNI错误, 请检查您的安装并在线程中重试异常 “main”java.lang.NoClassDefFoundError:com/pi4j/io/i2c/I2CFa
目录$UnsupportedBunsumberException 位于java.lang.Class.getDeclaredMethods0(本机方法) 位于java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 位于java.lang.Class.privateGetMethodRecursive(Class.java:3048) 位于java.lang.Class.getMethod0(Class.java:3018) 位于java.lang.Class.getMethod(Class.java:1784) 位于sun.launcher.launchelper.validateMainClass(launchelper.java:544 ) 在sun.launcher.LaunchHelper.checkAndLoadMain(LaunchHelper.java:526)
原因:java.lang.ClassNotFoundException: com.pi4j.io.i2c.I2CFactory$取消支持
tedBusNumberException 位于java.net.URLClassLoader.findClass(URLClassLoader.java:381) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:424) 位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 还有7个

这是密码

package main;

import java.io.IOException;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CFactory;

import devices.I2C.Pi4jI2CDevice;
import devices.sensorImplementations.MPU9250.MPU9250;

public class MPU9250Test {

    public static void main(String[] args)
    {
        I2CBus bus = null;
        System.out.println("Attempt to get Bus 1");
        try {
            final GpioController gpio = GpioFactory.getInstance();
            bus = I2CFactory.getInstance(I2CBus.BUS_1); 
            System.out.println("Got Bus, create devices");
            MPU9250 mpu9250 = new MPU9250(
                    new Pi4jI2CDevice(bus.getDevice(0x68)), // MPU9250 I2C device
                    new Pi4jI2CDevice(bus.getDevice(0x0C)), // ak8963 I2C 
                    100,                                    // sample rate
                    100);                                   // sample size
            Thread sensor = new Thread(mpu9250);
            sensor.start();

            Thread.sleep(10000);

            sensor.interrupt();

            for(int i = mpu9250.getAccelerometerReadingCount() -1; i>0; i--)
            {
                System.out.print("G: " + mpu9250.getRotationalAcceleration(i).toString());
                System.out.print(" A: " + mpu9250.getAcceleration(i).toString());
                System.out.println(" M: " + mpu9250.getGaussianData(i).toString());
            }
        } catch (I2CFactory.UnsupportedBusNumberException | InterruptedException | IOException e) {
            e.printStackTrace();
        }
    }

}
我已经使用I2Cdetect-y 1检查了设备在总线1上是否可见,这显示了地址0x68和0x76处的设备

我不知道这是否是执行环境或代码的问题,欢迎提供任何帮助

进一步的实验表明,删除异常处理程序不是编译时需要的选项。这里描述了异常类

问题在于,项目jar在传输到Raspberry Pi时没有获取到RPi上预装的pi4j软件的运行时链接。多亏了natdan,问题才得以解决

对项目pom.xml所做的更改如下:

将运行时依赖项添加到依赖项

<dependencies>
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-core</artifactId>
    <version>1.2-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-native</artifactId>
    <version>1.2-SNAPSHOT</version>
    <classifier>raspberrypi-dynamic</classifier>
    <type>so</type>
</dependency>

com.pi4j
pi4j磁芯
1.2-1
com.pi4j
pi4j本机
1.2-1
树莓动态
所以

经过进一步的实验证明,这种依赖性毕竟不是必需的,所以忽略上面的部分

然后将类路径作为清单条目添加到maven jar插件配置中:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!--<classpathPrefix>${pi.pi4j.Directory}/</classpathPrefix>-->
                        <mainClass>${pi.main.class}</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!-- Add the pi4j in runtime. -->
                        <Class-Path>${pi.pi4j.Directory}/pi4j-core.jar</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

org.apache.maven.plugins
maven jar插件
3.0.2
真的
${pi.main.class}
${pi.pi4j.Directory}/pi4j-core.jar
最后,从antrun部分的java命令中删除了类路径

                            <!-- run the JAR file on the Raspberry Pi -->
                            <sshexec host="${pi.host}" port="${pi.port}" username="${pi.user}"
                                password="${pi.password}" trust="true" failonerror="false"
                                verbose="true"
                                command="java -jar ${pi.deployDirectory}/${project.build.finalName}.jar" />

问题在于,项目jar在传输到Raspberry Pi时没有获取到RPi上预装的pi4j软件的运行时链接。多亏了natdan,问题才得以解决

对项目pom.xml所做的更改如下:

将运行时依赖项添加到依赖项

<dependencies>
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-core</artifactId>
    <version>1.2-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-native</artifactId>
    <version>1.2-SNAPSHOT</version>
    <classifier>raspberrypi-dynamic</classifier>
    <type>so</type>
</dependency>

com.pi4j
pi4j磁芯
1.2-1
com.pi4j
pi4j本机
1.2-1
树莓动态
所以

经过进一步的实验证明,这种依赖性毕竟不是必需的,所以忽略上面的部分

然后将类路径作为清单条目添加到maven jar插件配置中:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!--<classpathPrefix>${pi.pi4j.Directory}/</classpathPrefix>-->
                        <mainClass>${pi.main.class}</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!-- Add the pi4j in runtime. -->
                        <Class-Path>${pi.pi4j.Directory}/pi4j-core.jar</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

org.apache.maven.plugins
maven jar插件
3.0.2
真的
${pi.main.class}
${pi.pi4j.Directory}/pi4j-core.jar
最后,从antrun部分的java命令中删除了类路径

                            <!-- run the JAR file on the Raspberry Pi -->
                            <sshexec host="${pi.host}" port="${pi.port}" username="${pi.user}"
                                password="${pi.password}" trust="true" failonerror="false"
                                verbose="true"
                                command="java -jar ${pi.deployDirectory}/${project.build.finalName}.jar" />


由以下原因引起:java.lang.ClassNotFoundException:com.pi4j.io.i2c.I2CFactory$Unsupport tedBusNumberException-检查您的classpathjava-classpath中是否有该类java-classpath.:classes:/opt/pi4j/lib/'*''''''-jar/home/pi这包括Eclipse项目.pom文件和RPi中的pi4j库,已更新为使用pi4j 1.2-SNAPSHOT,这对结果没有影响。所有GPIO控制器和GPIO工厂行都已注释掉,因为它们不是必需的,结果没有更改。在第一次打印之前,代码似乎失败了,例如,在导入过程中。由以下原因引起:java.lang.ClassNotFoundException:com.pi4j.io.i2c.I2CFactory$Unsupplor tedBusNumberException-检查您的类路径java-classpath中是否有该类:classes:/opt/pi4j/lib/'*''''''-jar/home/pi这包括Eclipse项目.pom文件和RPi中的pi4j库,它们都已更新为使用pi4j1.2-SNAPSHOT,这对结果没有影响。所有GPIO控制器和GPIO工厂生产线都被注释掉,因为它们不是必需的,结果没有变化。在第一次打印之前,即导入期间,代码可能会出现故障。
部分特别修复了我的问题,谢谢!
部件特别解决了我的问题,谢谢!