Java auf Raspberry Pi

matze86

Bekanntes Mitglied
Hallo, ich möchte Java Programme auf dem bzw. für den Raspberry 4 erstellen.
Da auf der GUI nicht sonderlich empfehlenswert ist, habe ich ein Verzeichnis des Pi's per sshfs auf mein Ubuntu eingehängt. Da kann ich auch per Eclipse Java Dateien erstellen und per Terminal ausführen.

Jetzt ist aber meine Frage, ich möchte gerne für den Pi auch das pi4j Modul installieren (das habe ich schon), aber Eclipse findet die .jar Bibliothek nicht. Kann man das in Eclipse irgendwie einbinden?

Wäre es auch möglich, dann das Java Programm in Eclipe ausführen und das dann auf dem Pi starten? Das wäre genial.
Wenn nicht, gibt es eine Alternative?
 
K

kneitzel

Gast
Jetzt ist aber meine Frage, ich möchte gerne für den Pi auch das pi4j Modul installieren (das habe ich schon), aber Eclipse findet die .jar Bibliothek nicht.
Wie hast Du das denn eingebunden? Generell ist es nach meiner Erfahrung am einfachsten, wenn man mit Maven oder Gradle arbeitet. Dann ist einfach, das Projekt mit allen Details zu zeigen.
Und die Webseten von Libraries zeigen in der Regel, wie die Library eingebunden wird (wie bei pi4j auch) und man kann es sich auch auf der Webseite des Maven Repositories anzeigen lassen (So man den Aufbau nicht eh von Hand schnell macht).

Wäre es auch möglich, dann das Java Programm in Eclipe ausführen und das dann auf dem Pi starten? Das wäre genial.

Ich habe diesbezüglich keine praktischen Erfahrungen (Eclipse ist auch nicht meine Haupt-GUI), aber es gibt da diverse Erläuterungen, die das etwas aufzeigen.

Wichtig sind zwei Schritte:
a) Es muss ein Deployment stattfinden
b) Es muss gestartet werden und der Debugger muss verbunden werden

Dazu kannst Du Dir mal die folgenden Seiten anschauen:

Darüber hinaus ist es natürlich auch denkbar, einfach nur das Projekt in der IDE zu editieren aber das übersetzen direkt auf dem PI zu machen. (Sprich: JDK auf dem pi installieren und entweder im Projekt z.B, den Maven Wrapper hinzufügen oder direkt Maven auf dem pi installieren)

Dann würde die IDE mit den vielen Prozessen zur Unterstützung auf schneller Hardware laufen und das Bauen des Projektes komplett auf dem pi. Finde ich nicht prickelnd - denn die IO Performance ist alles andere als gut. Auf der SD Karte möchte ich nichts machen müssen. Wenn man per USB 3 eine Festplatte anschließt, dann geht es halbwegs, aber wenn man heutzutage SSDs gewohnt ist (am Besten NVMe mit PCIe-4 :) ), dann ist das auch extrem lahm.
 

matze86

Bekanntes Mitglied
Also ratet ihr Maven statt Eclipse? Wie gesagt bin relativ Neuling in Java.

Habe bisher die Pi4j .jar Datei in dem Home-Verzeichnis gehabt, und bei jeden Ausführen habe ich Das Java Programm im Terminal mit classpath und die Java Datei gestartet. Das ist umständlich weil ich sehr viel testen muss. Und wenn die .jar Datei nicht in Eclipse eingebunden ist, zeigt mir schon beim import immer Fehler an. Das war lästig.
Werde mal die Ratschläge durchschauen.
 
K

kneitzel

Gast
Maven ist nur ein reines Build Tool. Das ist nur eine kleine Komponente von einer IDE. Der große Vorteil dabei ist, dass ein Projekt unabhängig von einer Entwicklungsumgebung gebaut werden kann.

Für einen Entwickler bedeutet das: Er kann die IDE nutzen, die ihm gefällt. Und wenn notwendig, dann auch ganz ohne jede Entwicklungsumgebung (Z.B. bei sogenannten Build Servern - da wird die Software automatisch gebaut. Diese haben in der Regel keine IDE).

Und ein weiterer großes Vorteil: Bei Problemen ist eine Unterstützung einfach: Bei Maven gibst Du einfach die pom.xml weiter (z.B. hier im Forum) und dann sieht man direkt, was Sache ist. Bei Build hast du eine Textausgabe, die Du auch einfach bereit stellen kannst.
Also kein "Dann geh mal nach Windows -> Preferences, da dann unter Java -> Installed JRE die und die Settings prüfen .. dann auf dem Projekt Preferences aufmachen und im Fenster an 10 Stellen irgendwelche Informationen nachsehen ..." -> Unterstützung für eine IDE ist einfach unnötig kompliziert, die Dateien kennt kaum jemand (Kann man aber auch prüfen - bei Eclipse sind dies die .project und .classpath Dateien).
 

matze86

Bekanntes Mitglied
Ich habe mir das ganze mal in Ruhe angeschaut.
Ja Maven ist wirklich gut. Da kann man Problemlose importen.
Aber es ist nicht so einfach es einzurichten. Gerade was die pom.xml betrifft.
 

mihe7

Top Contributor
Gerade was die pom.xml betrifft.
Da kopierst Du Dir einfach ein Vorlage und passt den Spaß nach Deinen Wünschen an. Fürs Forum hab ich z. B. eine für Java 1.8 und jUnit 4:
XML:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.javaforum.mihe7</groupId>
    <artifactId>ARTIFACT</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

Außerdem kannst Du doch in jeder IDE ein Maven-Projekt anlegen.
 

matze86

Bekanntes Mitglied
Also Wenn ich das jetzt richtig verstanden habe. Maven ist ein Build Tool, womit man externe Abhängigkeiten einpflegen kann und kompilieren kann. Wenn die Abhängigkeiten geändert werden, wird automatisch auf updates überprüft und aktualisiert!?
Wenn ich in Eclipse ein neues Maven Projekt anlege, kann ich unter "src/main/java" meine Package anlegen!?
Was kommt dann unter "src/main/recources" und "src/test/java"?
Meine pom.xml sieht nach dem anlegen und einfügen des "dependency" von der offiziellen mvn Seite (Pi4j-Projekt ging es nicht) hier der Code der auf der Pij4 Projekt seite nicht ging:
XML:
<dependency>
  <groupId>com.pi4j</groupId>
  <artifactId>pi4j-parent</artifactId>
  <version>1.2</version>
  <type>pom</type>
</dependency>
.
)
sieht jetzt so aus:
XML:
<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>
  <groupId>ledgruppe</groupId>
  <artifactId>gruppe</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 
  <dependencies>
 
<!-- https://mvnrepository.com/artifact/com.pi4j/pi4j-device -->
<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-device</artifactId>
    <version>1.3</version>
</dependency>

  </dependencies>
 
 
</project>

Ist das bis jetzt soweit alles richtig?

Und wenn ich von Eclipse ein Remote Debugging ausführen will (z.B. zum Raspi, Datei ist per sshfs auf dem Rechner eingehängt), muss ich Auf > Ausführen > Debug Konfiguration > ferne Ferne Java Anwendung. Richtig?
 
K

kneitzel

Gast
Also Abhängigkeiten werden nicht automatisch aktualisiert. So wirst Du immer die Version 1.3 von pi4j-device einbinden - selbst wenn eine neue Version heraus kommt. Du müsstest dann selbst die Version anpassen.

Es gibt aber auch Tools, die hier helfen. Sowohl als Maven Plugin als auch innerhalb der IDE. IntelliJ sagt einem z.B. auch, wenn eine neuere Version zur Verfügung steht.

Und bezüglich remote debugging hatte ich Dir in #2 zwei Links gegeben, die das etwas aufgezeigt haben. Es wäre evtl. hilfreich, am Anfang einfach mal so einer Beschreibung zu folgen oder zumindest die Schritte dort anzusehen und versuchen, diese zu verstehen.
 
K

kneitzel

Gast
Ja, es ist aber sehr minimal. Und je nach Java Version wirst Du ein Problem bekommen (Maven setzt wohl per default source auf 1.5 und das wird nicht mehr unterstützt von aktuellen JDKs).

Dazu kannst Du ggf. noch ein
XML:
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
mit einfügen.

Und dann willst Du ggf noch paar Dinge mehr setzen, damit das erzeugte JAR z.B. mit java -jar gestartet werden kann.
 

matze86

Bekanntes Mitglied
Ich habe jetzt die Anleitung 1:1 durchgearbeitet,
Jetzt bei der build.xml kommt folgender Fehler:
Buildfile: /home/matze/raspi/hello/build.xml [typedef] Could not load definitions from resource org/apache/maven/artifact/ant/antlib.xml. It could not be found. maven-install: BUILD FAILED /home/matze/raspi/hello/build.xml:21: Problem: failed to create task or type antlib:org.apache.maven.artifact.ant:mvn Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any <presetdef>/<macrodef> declarations have taken place. No types or tasks have been defined in this namespace yet This appears to be an antlib declaration. Action: Check that the implementing library exists in one of: -/home/matze/.p2/pool/plugins/org.apache.ant_1.10.11.v20210720-1445/lib -/home/matze/.ant/lib -a directory added on the command line with the -lib argument Total time: 278 milliseconds
Was fehlt da noch?
 

matze86

Bekanntes Mitglied
Ich habe jetzt die "maven-ant-tasks-2.1.3.jar" herunter geladen, ins (auf dem Ubuntu Rechner) ~/.ant/lib und in das ~/.p2/pool/plugins/org.apache.ant_1.10.11.v20210720-1445/lib/ Verzeichnis kopiert, und in der build.xml folgendes angepasst:
XML:
<path id="maven-ant-tasks.classpath" path="lib/maven-ant-tasks-2.1.4-SNAPSHOT.jar" />
      <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
               uri="antlib:org.apache.maven.artifact.ant"
               classpathref="maven-ant-tasks.classpath" />
trotzdem die gleiche Meldung. Oder muss es auf dem Raspberry?
 

matze86

Bekanntes Mitglied
Das habe ich gemacht. In den Paket "Gruppe" ein lib-Ordner erstellt und es hinein kopiert. Trotzdem kommt immer noch die Fehlerausgabe.
 

mihe7

Top Contributor
Ausgehend davon
Buildfile: /home/matze/raspi/hello/build.xml
und Deinen sonstigen Ausführungen würde ich sagen:
Code:
cd ~/raspi/hello
mkdir lib
cp ~/.ant/lib/maven-ant-tasks-2.1.3.jar lib
ant
Wenn es dann immer noch nicht geht, sag nochmal Bescheid, dann spiel ich das mal durch.
 

matze86

Bekanntes Mitglied
Ant war noch gar nicht installiert, das habe ich noch mit "sudo snap install ant --classic" nachgeholt.

Die Befehle von #21 habe ich ausgeführt.
Ausgabe: Buildfile: /home/matze/raspi/hello/build.xml maven-install: [artifact:mvn] Downloading: org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom from repository central at http://repo1.maven.org/maven2 [artifact:mvn] Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom [artifact:mvn] [WARNING] Unable to get resource 'org.apache.maven:apache-maven:pom:2.0.10' from repository central (http://repo1.maven.org/maven2): Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom [artifact:mvn] Downloading: org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom from repository central at http://repo1.maven.org/maven2 [artifact:mvn] Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom [artifact:mvn] [WARNING] Unable to get resource 'org.apache.maven:apache-maven:pom:2.0.10' from repository central (http://repo1.maven.org/maven2): Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/apache/maven/apache-maven/2.0.10/apache-maven-2.0.10.pom [null] An error has occurred while processing the Maven artifact tasks. [null] Diagnosis: [null] [null] Unable to resolve artifact: Missing: [null] ---------- [null] 1) org.apache.maven:apache-maven:pom:2.0.10 [null] Path to dependency: [null] 1) org.apache.maven:super-pom:pom:2.0 [null] 2) org.apache.maven:apache-maven:pom:2.0.10 [null] [null] ---------- [null] 1 required artifact is missing. [null] [null] for artifact: [null] org.apache.maven:super-pom:pom:2.0 [null] [null] from the specified remote repositories: [null] central (http://repo1.maven.org/maven2) [null] [null] BUILD FAILED /home/matze/hello/build.xml:21: Unable to resolve artifact: Missing: ---------- 1) org.apache.maven:apache-maven:pom:2.0.10 Path to dependency: 1) org.apache.maven:super-pom:pom:2.0 2) org.apache.maven:apache-maven:pom:2.0.10 ---------- 1 required artifact is missing. for artifact: org.apache.maven:super-pom:pom:2.0 from the specified remote repositories: central (http://repo1.maven.org/maven2) Total time: 0 seconds
Die build.xml sieht so aus:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<project name="hello" default="remote-run" basedir="."
    xmlns:artifact="antlib:org.apache.maven.artifact.ant">

    <!-- Setup RASPBERRY PI properties -->
    <property name="raspberrypi" value="192.168.178.22" />
    <property name="raspberryfolder" value="/home/pi/Java/hello/src/main/java/pi/hello/" />
    <property name="username" value="pi" />
    <property name="password" value="1" />

    <path id="maven-ant-tasks.classpath" path="${ant.libs.dir}/maven-ant-tasks-2.1.3.jar" />

    <typedef
        resource="org/apache/maven/artifact/ant/antlib.xml"
        uri="antlib:org.apache.maven.artifact.ant"
        classpathref="maven-ant-tasks.classpath" />
       
    <!-- Add maven install target to be run before deploy -->
       
    <target name="maven-install">
        <artifact:mvn pom="pom.xml">
            <arg value="install"/>
        </artifact:mvn>
    </target>

    <!-- Locate the prokect jar and transfer via scp to RASPBERRY PI -->
    <target name="transfer" depends="maven-install">
        <first id="jars">
            <!--
            <fileset dir="target" includes="**/*-SNAPSHOT-jar-with-dependencies.jar" />
            -->
            <fileset dir="target" includes="**/*.jar" />
        </first>
        <pathconvert pathsep="," property="jar.path" refid="jars" />
        <basename file="${jar.path}" property="jar.filename" />
        <echo>">>> Found application ${jar.path}"</echo>

        <echo>">>> Copying application to ${raspberrypi}:${raspberryfolder}/${jar.filename}"</echo>
        <scp
            localfile="${jar.path}"
            todir="${username}:${password}@${raspberrypi}:${raspberryfolder}"
            trust="true" />

    </target>
       
    <!-- Run java -->
    <target name="remote-run" depends="transfer">  
        <echo>">>> Starting ${raspberrypi}:${raspberryfolder}/${jar.filename}"</echo>

        <sshexec
            host="${raspberrypi}"
            username="${username}"
            password="${password}"
            trust="true"
            failonerror="true"
            usepty="true"
            command="java -jar ${jar.filename}" />
    </target>
   
    <!-- Run java in debug mode and keep waiting for execution -->
    <target name="remote-debug" depends="transfer">  
        <echo>">>> Starting ${raspberrypi}:${raspberryfolder}/${jar.filename} in debug mode"</echo>
        <sshexec
            host="${raspberrypi}"
            username="${username}"
            password="${password}"
            trust="true"
            failonerror="true"
            usepty="true"
            command="java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=y -jar ${jar.filename}" />
    </target>
    <path id="maven-ant-tasks.classpath" path="lib/maven-ant-tasks-2.1.4-SNAPSHOT.jar" />
          <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
                   uri="antlib:org.apache.maven.artifact.ant"
                   classpathref="maven-ant-tasks.classpath" />
</project>
 
K

kneitzel

Gast
Das ist so remote ohne eigenes Testprojekt nur schwer zu sagen. Ich bin mir jetzt nicht ganz sicher, woher das genau kommt.

Wichtig ist: am 15. Jan 2020 erfolgte die Umstellung auf https, daher sollte es neuer sein.

a) Welche Maven Version hast Du installiert? Und ist in ~/.m2 eine settings.xml, in der ggf. das Repository eingetragen ist? (Sollte aber per Default alles aus dem super POM kommen, die sozusagen "integriert" ist.)

b) Es kommt evtl. von Ant. Da wäre dann dann etwas wie
XML:
<artifact:dependencies filesetId="build-dependency-jars" pomRefId="pom">
      <remoteRepository id="mavenCentral" url="https://repo1.maven.org/maven2"/>
    </artifact:dependencies>
in dem build.xml evtl. eine Lösung. (Siehe https://stackoverflow.com/questions...k-transitive-pom-dependencies-and-https-issue)
 

matze86

Bekanntes Mitglied
Maven Version:

mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 1.8.0_292, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: de_DE, platform encoding: UTF-8
OS name: "linux", version: "5.11.0-37-generic", arch: "amd64", family: "unix"


Und ist in ~/.m2 eine settings.xml, in der ggf. das Repository eingetragen ist?
Nein da ist keine settings.xml.

Ich habe jetzt mal
<artifact:dependencies filesetId="build-dependency-jars" pomRefId="pom">
<remoteRepository id="mavenCentral" url="https://repo1.maven.org/maven2"/>
</artifact:dependencies>
in die build.xml eingefügt.
Ausgabe

Buildfile: /home/matze/raspi/hello/build.xml
[artifact:dependencies] An error has occurred while processing the Maven artifact tasks.
[artifact:dependencies] Diagnosis:
[artifact:dependencies]
[artifact:dependencies] Reference 'pom' was not found.

BUILD FAILED
/home/matze/raspi/hello/build.xml:77: Reference 'pom' was not found.

Total time: 530 milliseconds


Heißt er findet eine pro nicht.
 
K

kneitzel

Gast
a) Maven 3.6.3 sollte ok sein.

b) der Eintrag muss ggf. angepasst werden - er referenziert da ja etwas. Aber ich habe bisher nicht die Zeit gehabt, mir das Ant Buildfile im Detail anzusehen, was er da überhaupt alles so treibt.

Ggf. einmal das Projekt zippen (nach einem säubern, so dass Ausgabedateien weg sind) und hier bereit stellen so dass wir da evtl. selbst einmal kurz testen können. Das wäre ggf. das einfachste.
 
K

kneitzel

Gast
Ok, wenn ich das build.xml richtig verstehe, dann ist das ja nur ein ant Rahmen um das Maven Projekt. Fürs bauen wird nur Maven verwendet.

Daher ist die Änderung am bbuild.xml, die ich vorgeschlagen hatte, wohl Quatsch. Hast Du mal das Projekt per mvn install gebaut?
Sprich: Wir gehen die einzelnen Schritte, die ant machen soll, erst einmal manuell durch um sicher zu gehen, dass da alles funktioniert.

Ich gewinne aber gerade das Problem, dass die gefundenen Tutorials zu veraltet sind. Bei den maven-ant-tasks findet man z.B., dass diese deprecated sind.

Evtl. macht es auch mehr Sinn, wenn man den Ant Part doch über board wirft und statt dessen alles mit Maven macht. Exec Maven Plugin kann ja Dinge ausführen und evtl. für den Copy hin zum Pi noch das Wagon Plugin? Wie siehst Du das nach dem aktuellen Verlauf @mihe7?
 

mihe7

Top Contributor
Ja, das war auch der Ansatz im oben geposteten Link: aus Maven ein Shellskript aufrufen, das den Spaß rüberschiebt und ausführt. Warum man da jetzt noch ein weiteres Buildsystem dafür bemühen will, ist mir ehrlich gesagt auch nicht ganz klar - ok, ist plattformunabhängig(er) aber wen interessiert das Zuhause?
 
K

kneitzel

Gast
Ich habe mir das noch etwas durch den Kopf gehen lassen und ja - das ist so einfach zu komplex.

Ich habe da jetzt einfach einmal ein Shell-Script erstellt:
Bash:
#!/bin/sh
# copy and start MavenTest on remote system

FILE=MavenTest-0.0.1-SNAPSHOT.jar
REMOTEPATH=/home/konrad/tmp/
HOST=localhost
USER=konrad

scp target/$FILE $USER@$HOST:$REMOTEPATH
ssh -l $USER $HOST java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 -jar $REMOTEPATH$FILE

Den Kopf muss man anpassen. Anmeldung erfolgt über authorized_keys
In einem Projekt würde ich den Block mit den Variablen in eine separate "User" Datei packen und nur eine example Datei einchecken. Dann kann jeder Entwickler sich das für jede Umgebung selbst kopieren und anpassen. Und dann würde der Block halt lediglich die andere Datei mit einlesen.

Das wartet auch auf den Debugger. Wenn man das nicht will, dann müsste man suspend=n machen.

Unter Run -> Debug Configurations ... Kann man dann einfach ein Element bei Remote Java Application anlegen ...

Und das, was man dann so machen will / muss kann man dann etwas zusammen bauen in Eclipse:
- Build erfolgt über Maven, also man macht sich ggf. eine maven Package Run Configuration
- Das Script kann man über eine c/C++ Application laufen lassen - einfach per browse knopf das Script auswählen

Dann hat man die Teile, die man braucht, auch in der IDE zusammen. Das kann man ggf. auch als Gruppe zusammen fassen. Die Option habe ich jetzt auch gesehen in Eclipse, aber Eclipse ist nun einmal nicht die bevorzugte IDE von mir, daher habe ich jetzt an der Stelle einfach mal abgebrochen.

Ich hoffe, das ist ein einfacherer Ansatz für Dich.
 

matze86

Bekanntes Mitglied
Vielen dank für die ausführliche Beschreibung. Dennoch habe ich viele Fragezeichen.
Wo muss das Script erstellt werden und wie soll ich es über eine über eine c/C++ Application laufen lassen? Kenne mich c/c++ leider nicht aus.
Was das Script an sich macht weis ich, kenne mich in linux (bash) gut aus.

Also man muss das Script erstellen (wohin?) dann mit Eclipse das Script starten und fern debuggen? richtig?
Das ganze als Projekt Maven.
 

matze86

Bekanntes Mitglied
Habe jetzt das Script erstellt und soweit angepasst. Habe unter Eclipse Ausführen > externe Tools >Externe Tools Konfiguration das Script ausgewählt, jetzt kann ich es schon mal starten.
Das heißt ich muss mein Quellcode schreiben, dann unter maven ausführen (das klappt).
Nun muss ich noch eine .jar Datei erzeugen. wie mache ich das mit Maven?
 
K

kneitzel

Gast
Also zu der Run Configuration:
Du erstellst keine C/C++ Anwendung. Das wurde nur benutzt, denn bei C/C++ wird einfach am Ende etwas gestartet. Und das kann prinzipiell alles sein. Sieh es einfach als ein universellen Starter.

Ich habe das Script direkt im Projektordner.
Bei der Run Configuration bei C/C++ Application ein neues Element erzeugen.
Dann beim Feld C/C++ Application einfach auf Browse... gehen und das Script auswählen.
Damit er erst gar nicht versucht beim Start irgendwas zu bauen, markiert man vorsichtshalber noch "Disable auto build".

Das ist bezüglich des Scripts alles. Und damit kannst Du die Applikation remote starten und mit den Parametern wartet die Applikation nach dem Start erst auf den Debugger.

Aber als externes Tool kannst Du es natürlich auch prinzipiell machen.

Und Maven erzeugt automatisch eine jar Datei. Damit Du die aber auch mit java -jar starten kannst, musst Du im Manifest die main Class vorgeben. Das geht z.B. mit dem maven jar plugin.
Die Abhängigkeiten können wir auch noch mit rein packen -> shade plugin.

Das kann dann z.B. so aussehen:
XML:
<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>
    <groupId>de.kneitzel</groupId>
    <artifactId>MavenTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Test</name>
    <description>Maven Test Project</description>

    <properties>
        <main.class>de.kneitzel.maventest.Test</main.class>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>

        <!-- plugin versions -->
        <maven.compiler.version>3.8.1</maven.compiler.version>
        <maven.jar.version>2.1</maven.jar.version>
        <maven.shade.version>3.2.4</maven.shade.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>
                    <release>${java.version}</release>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.version}</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>${main.class}</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${maven.shade.version}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>
 
K

kneitzel

Gast
Du hast in den Run Configurations das Maven Build - das musst Du nutzen. Da kannst Du als goal z.B. package angeben (Das nutze ich immer, Eclipse bietet aber wohl vorkonfiguriert das goal install. Das geht auch.

Diese "goals" sind der Build lifecycle. Maven geht immer den gleichen Zyklus durch bis zu dem angegeben. Bei package wird alles gebaut und zusammen gepackt, d.h. Du hast danach das jar File. Bei install wird das auch noch im lokalen Repository abgelegt, aber das brauchst Du ja eigentlich nicht. Aber stören tut es auch nicht.
 

matze86

Bekanntes Mitglied
Genau, das habe ich schon mehrfach versucht, nur es kommt immer der gleiche Fehler:
Java:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/matze/.p2/pool/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.18.0.20210618-2246/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [file:/home/matze/eclipse/java-2021-09/eclipse/configuration/org.eclipse.osgi/5/0/.cp/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/matze/.p2/pool/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.18.0.20210618-2246/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [file:/home/matze/eclipse/java-2021-09/eclipse/configuration/org.eclipse.osgi/5/0/.cp/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------< matti:matti >-----------------------------
[INFO] Building matti 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ matti ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ matti ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/matze/eclipse-workspace/matti/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Source option 5 is no longer supported. Use 7 or later.
[ERROR] Target option 5 is no longer supported. Use 7 or later.
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.692 s
[INFO] Finished at: 2021-10-21T11:11:56+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project matti: Compilation failure: Compilation failure:
[ERROR] Source option 5 is no longer supported. Use 7 or later.
[ERROR] Target option 5 is no longer supported. Use 7 or later.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
 

mihe7

Top Contributor
Du musst in Deiner pom.xml Source und Target des Compilers auf Deine Java-Version anpassen, s. die pom.xml von @kneitzel:
Code:
        <java.version>17</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
 
K

kneitzel

Gast
Und zu den SLF4J Fehlermeldungen am Anfang: Die einfach erst einmal ignorieren. Wieso Eclipse bei einer 08/15 Installation nicht in der Lage ist, das so sauber zu installieren, dass da beim Maven Build keine Meldung vom zugrunde liegendem Logging Framework kommt, erschliesst sich mir nicht.
 

matze86

Bekanntes Mitglied
Bevor ich es jetzt aufgebe habe ich nochmal einen Zip Ordner angehängt, da ist das ganze package drin.
 

Anhänge

  • matti.zip
    9,7 KB · Aufrufe: 0
K

kneitzel

Gast
Deine klasse Matti ist im package matti, daher ist der korrekte Name der Klasse "matti.Matti":
XML:
<main.class>matti.Matti</main.class>

Nach der Änderung läuft es bei mir:
Code:
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /home/konrad/tmp/target/matti-0.0.1-SNAPSHOT.jar with /home/konrad/tmp/target/matti-0.0.1-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  17.053 s
[INFO] Finished at: 2021-10-21T13:02:57+02:00
[INFO] ------------------------------------------------------------------------
konrad@macmini:~/tmp$ java -jar target/original-matti-0.0.1-SNAPSHOT.jar
hallo
konrad@macmini:~/tmp$
 

matze86

Bekanntes Mitglied
Ja genau läuft.
Jetzt habe ich das ssh Script nach meinen Bedürfnissen angepasst, wenn ich es das 1. mal ausführe, dann steht in der Konsole
Listening for transport dt_socket at address: 800
Ab dem 2. mal kommt die Meldung:
ERROR: transport error 202: bind failed: Address already in use ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c:735]
Wenn ich den Port wechsele dann geht's wieder.

Wenn ich fern Debuggen möchte ( Ausführen > Debug Konfigurtionen > Ferne Java-Anwendung) mein Projekt, dann die IP des Raspi's und den Port (8000) eingebe kommt die Meldung:
Die Verbindung zur fernen VM konnte nicht hergestellt werden. Die Verbindung wurde verweigert. Verbindungsaufbau abgelehnt

Muss auf dem Raspi auch Eclipse+ Maven installiert sein?
 

mihe7

Top Contributor
Also kann/darf man das Script nur 1x ausführen?
Ich dachte jedes mal wenn man am Code etwas verändert und neu baut.
Es verhält sich etwas anders. Grundsätzlich bleibt es dem Script überlassen, was es tut. Aktuell startest Du halt einfach Deine Anwendung, die bindet den Port und wenn sie beendet wird, wird der Port auch wieder freigegeben.
 

matze86

Bekanntes Mitglied
Ändere im Skript mal address=8000 zu address=*:8000.
Hat sich nichts geändert. Immer noch die Ausgabe Die Verbindung zur fernen VM konnte nicht hergestellt werden. Die Verbindung wurde verweigert. Verbindungsaufbau abgelehnt

Aber was mich stutzig macht ist, das man in der Debug Konfigurationen nicht mal user und Passwort eingeben muss.
 
K

kneitzel

Gast
Die Debug Konfiguration sieht keine Anmeldung vor. Jeder im Netzwerk kann sich verbinden. Der erste, der sich verbindet, gewinnt.

Daher ist das auch nicht gerade sicher - aber in einem Heimnetzwerk dürfte es egal sein, da es ja nur kurzzeitig zum Debuggen gestartet wird.

Evtl. blockiert eine Firewall den Zugriff auf den Port. Dann müsstest Du den erst freigeben. Wenn Du Raspbian verwendest, dann dürfte aber eigentlich keine Firewall aktiv sein per default (so das nicht geändert wurde.

Was man aber machen könnte: ssh auf den pi startet man eifnach mit Portumleitung. Das macht es auch deutlich sicherer. Dann könnte der Debug-Port 127.0.0.1:8000 sein und ssh bringt ihn auf dein lokalen Port 8000. Das würde eine Firewall Problematik umgehen und auch, dass irgend jemand sich einfach damit verbindet und Schindluder treibt.
 

matze86

Bekanntes Mitglied
Habe es versucht, geht leider nicht. anbei nochmal ein bild von den Einstellungen: Bei Host habe ich auch die IP des Raspis getestet.
 

Anhänge

  • java1.png
    java1.png
    100,9 KB · Aufrufe: 3
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2
sasnitzer java augensumme von zwei würfeln ist 1 Java Basics - Anfänger-Themen 8
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
Hzrfa Länge der längsten Kette java Java Basics - Anfänger-Themen 56

Ähnliche Java Themen

Neue Themen


Oben