老实说,我要放弃了,我已经尝试了这么多不同的可能性,几个星期,几乎一个月,多个问题。
我是一个新手,尤其是使用java的程序员,但是我对java有很好的理解。
我能够创建一个maven项目--没问题,java本身的结构没有问题,但是我不完全理解pom.xml。
这个文件编译得很好,但是当我用java -jar (filename)启动它时,我得到了以下输出;
线程"main“中的异常: com/pi4j/Pi4J at com.pi.rasberri.Main.main(Main.java:16),由: java.lang.ClassNotFoundException: com.pi4j.Pi4J at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520).
这是我的诗,我已经象征性地几乎被肢解了;
(The long links) <modelVersion>4.0.0</modelVersion> <groupId>com.pi</groupId> <artifactId>Rasberri</artifactId> <version>3.6.1</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.32</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version> </dependency> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-plugin-raspberrypi</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.pi4j</groupId> <artifactId>pi4j-plugin-pigpio</artifactId> <version>2.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> maven-jar-plugin3.1.0真com.pi.rasberri.Main库/真com.pi.rasberri.Main假真
我的代码是com.pi.rasberri.Main
package com.pi.rasberri;
import com.pi4j.Pi4J;
import com.pi4j.io.gpio.digital.DigitalOutput;
import com.pi4j.io.gpio.digital.DigitalState;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
private static final int PIN_LED = 6;
public static void main(String[] args) throws Exception{
var pi4j = Pi4J.newAutoContext();
int x = 0;
var ledConfig = DigitalOutput.newConfigBuilder(pi4j)
.id("led")
.name("LED Flasher")
.address(PIN_LED)
.shutdown(DigitalState.LOW)
.initial(DigitalState.LOW)
.provider("pigpio-digital-output");
var led = pi4j.create(ledConfig);
while(x != 5){
led.high();
sleep(1000);
led.low();
sleep(500);
x++;
}
}
static void sleep(int z){
try {
Thread.sleep(z);
} catch (InterruptedException ex) {
System.out.println("Thread.sleep went fucky wucky");
}
}
}我很感激任何能指引我到某个地方的事情,因为我在这一点上很迷茫,当然,如果我想出答案,我会让大家知道的!提前感谢
谢谢你,tgdavies,你链接的那篇文章是那个特定问题的答案!**万一其他人和我有相同的问题链; \*\*UPDATE\*\* ,但话说回来,我直接遇到了另一个错误; main信息com.pi4j.Pi4J --新的自动上下文主信息com.pi4j.Pi4J - New context builder main INFO com.pi4j.Pi4J--将平台添加到管理平台地图id=raspberrypi;name=RaspberryPi平台;priority=5;class=com.pi4j.plugin.raspberrypi.platform.RaspberryPiPlatform异常在线程“主”com.pi4j.provider.exception.ProviderNotFoundException: Pi4J提供者-数字输出无法找到。请将此“provider”JAR包含在类路径中。在com.pi4j.provider.impl.DefaultRuntimeProviders.get(DefaultRuntimeProviders.java:238) at com.pi4j.provider.impl.DefaultProviders.get(DefaultProviders.java:147) at com.pi4j.provider.Providers.get(Providers.java:253) at com.pi4j.context.Context.create(Context.java:316) at com.pi4j.internal.IOCreator.create(IOCreator.java:58) at com.pi4j.internal.IOCreator.create(IOCreator.java:96) at com.pi4j.internal.IOCreator.create(IOCreator.java:176) com.pi.rasberri.Main.main(Main.java:27)
我打扫了一下pom.xml;
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-raspberrypi</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-pigpio</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<build>
<plugins> <!--Package all libraries classes into one runnable jar -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>com.pi.rasberri.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>在这一点上,我知道至少有两种可能性,
但老实说,我真的不知道从哪里开始故障排除--我尝试过一些方法,其中之一就是尝试另一种编译文件的方法,但另一种方法只会导致更长的错误串。
接下来我该试试什么呢?提前感谢!感谢任何建议到目前为止进行故障排除的人!
哦,目标是希望只创建一个单数jar文件在raspberry pi上执行。
update I试图在Raspberri上运行它,结果导致了相同的错误,所以不是这样
发布于 2021-12-18 13:11:40
谢谢tgdavies、MadProgrammer和khmarbaise提供的答案,修复方法是创建一个胖jar,基本上是一个包含一个文件中所有依赖项的jar文件,例如可以在原始问题/注释中找到。
更新!!
Pi4j已经在他们的网站上发布了关于V2脂肪罐的说明!我试过了,现在效果很好
https://pi4j.com/getting-started/minimal-example-application-fatjar/
发布于 2021-12-18 21:45:56
我没有一个树莓派做最后的测试,但我想我找到了一个解决办法。
使用这个答案,我设法使2021-10-30-raspios-bullseye-armhf-lite.img在Docker中运行。我使用您的代码构建了一个项目,并复制了所需的所有文件,并试图启动它(mypiapp是我的jar,包含您的主类):
java -cp mypiapp-0.0.1-SNAPSHOT.jar:lib/pi4j-core-2.1.1.jar:lib/pi4j-library-pigpio-2.1.1.jar:lib/pi4j-plugin-pigpio-2.1.1.jar:lib/pi4j-plugin-raspberrypi-2.1.1.jar:lib/slf4j-api-1.7.32.jar:lib/slf4j-simple-1.7.32.jar com.github.fwi.mypiapp.MyPiApp这给了我一个错误:
[main] ERROR com.pi4j.library.pigpio.util.NativeLibraryLoader - Unable to load [libpi4j-pigpio.so] using path: [/lib/armhf/libpi4j-pigpio.so]
java.lang.UnsatisfiedLinkError: /tmp/libpi4j-pigpio1770932771276400506.so: libpigpio.so.1: cannot open shared object file: No such file or directory这是一个令人沮丧的问题。但至少没有ProviderNotFoundException (我也可以使用“带依赖关系的胖jar”来再现它)。长的java-命令似乎可以防止这种异常发生。
我可以通过运行(在Raspbian中)来改善这种情况。
apt install pigpio现在,长java-命令显示:
[main] WARN com.pi4j.library.pigpio.impl.PiGpioNativeImpl - PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed这是在Docker容器中运行时所期望的。但至少找到并加载了本机库。
现在是为了解决“胖罐子”问题的工作。我们将从Spring借用一些Maven设置和代码。春天也可以制造脂肪罐,它做的更复杂,但也更好。pom现在看起来像(在需要的地方用项目名称更新):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
</parent>
<groupId>com.github.fwi</groupId>
<artifactId>mypiapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
<start.class>com.github.fwi.mypiapp.MyPiApp</start.class>
<pi4j.version>2.1.1</pi4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-raspberrypi</artifactId>
<version>${pi4j.version}</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-plugin-pigpio</artifactId>
<version>${pi4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start.class}</mainClass>
<layout>ZIP</layout>
<executable>false</executable>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>只需运行mvn clean package来构建胖jar。使用java -jar mypiapp-fat.jar运行它(在我的例子中),它给出了与使用长java-命令运行时完全相同的错误(即没有ProviderNotFoundException)。因此,我认为这可以在一个真正的覆盆子-Pi( apt install pigpio可能仍然是必需的)。
一些注意事项:
发布于 2022-02-08 13:23:35
我在使用Raspberry P4、java 11和pi4j v2时也遇到了同样的问题。我解决了直接从树莓下载猪猪库的问题。
sudo apt-get install pigpio在图书馆安装好后,这个罐子工作得很好。如果您不是root用户,也要记住使用sudo运行程序。
https://stackoverflow.com/questions/70400115
复制相似问题