首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pi4j使用java与raspberry Pi不工作

Pi4j使用java与raspberry Pi不工作
EN

Stack Overflow用户
提问于 2021-12-18 00:25:57
回答 3查看 1K关注 0票数 1

老实说,我要放弃了,我已经尝试了这么多不同的可能性,几个星期,几乎一个月,多个问题。

我是一个新手,尤其是使用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

代码语言:javascript
复制
    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;

代码语言:javascript
复制
<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>

在这一点上,我知道至少有两种可能性,

  1. 代码只需要在raspberry pi上运行。
  2. 我不正确地进入了类路径

但老实说,我真的不知道从哪里开始故障排除--我尝试过一些方法,其中之一就是尝试另一种编译文件的方法,但另一种方法只会导致更长的错误串。

接下来我该试试什么呢?提前感谢!感谢任何建议到目前为止进行故障排除的人!

哦,目标是希望只创建一个单数jar文件在raspberry pi上执行。

update I试图在Raspberri上运行它,结果导致了相同的错误,所以不是这样

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-18 13:11:40

谢谢tgdavies、MadProgrammer和khmarbaise提供的答案,修复方法是创建一个胖jar基本上是一个包含一个文件中所有依赖项的jar文件,例如可以在原始问题/注释中找到。

更新!!

Pi4j已经在他们的网站上发布了关于V2脂肪罐的说明!我试过了,现在效果很好

https://pi4j.com/getting-started/minimal-example-application-fatjar/

票数 1
EN

Stack Overflow用户

发布于 2021-12-18 21:45:56

我没有一个树莓派做最后的测试,但我想我找到了一个解决办法。

使用这个答案,我设法使2021-10-30-raspios-bullseye-armhf-lite.img在Docker中运行。我使用您的代码构建了一个项目,并复制了所需的所有文件,并试图启动它(mypiapp是我的jar,包含您的主类):

代码语言:javascript
复制
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

这给了我一个错误:

代码语言:javascript
复制
[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中)来改善这种情况。

代码语言:javascript
复制
apt install pigpio

现在,长java-命令显示:

代码语言:javascript
复制
[main] WARN com.pi4j.library.pigpio.impl.PiGpioNativeImpl - PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed

这是在Docker容器中运行时所期望的。但至少找到并加载了本机库。

现在是为了解决“胖罐子”问题的工作。我们将从Spring借用一些Maven设置和代码。春天也可以制造脂肪罐,它做的更复杂,但也更好。pom现在看起来像(在需要的地方用项目名称更新):

代码语言:javascript
复制
<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可能仍然是必需的)。

一些注意事项:

  • Spring父程序设置了一些好的Maven默认值,还为spring-boot-maven-plugin设置了好的缺省值
  • 必须使用java.version属性设置Java。
  • 使用包含start.class -method的类的名称更新-method。
  • pom.xml中的3个依赖项将引入所有其他依赖项(依赖项的依赖项)。
  • Spring文档参考资料:包装和嵌套jars 选项
票数 1
EN

Stack Overflow用户

发布于 2022-02-08 13:23:35

我在使用Raspberry P4、java 11和pi4j v2时也遇到了同样的问题。我解决了直接从树莓下载猪猪库的问题。

代码语言:javascript
复制
sudo apt-get install pigpio

在图书馆安装好后,这个罐子工作得很好。如果您不是root用户,也要记住使用sudo运行程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70400115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档