VS Code Project run error

terashy

Mitglied
Hallo, ich kriege jeweils den Fehler java.lang.NoClassDefFoundError:, wenn ich versuche ein Java File in einem VS Code Projekt zu starten.

Ich kann den .java File direkt mit java /home/$USER/ownCloud/java/src/main/java/com/terashy/java/Age2.java ausführen
jedoch in VS Code terminal versucht es zuerst in den Folder zu wechseln und möchte dann den Script ausführen:
cd "/home/$USER/ownCloud/java/src/main/java/com/terashy/java/" && javac Age2.java && java Age2

Wen ich den importieren Zeile package com.terashy.java; lösche, würde es funktionieren, aber das ist wahrscheinlich nicht die Lösung.

Wie richte ich den Code-Runner so ein, dass ich den Script in einem Projekt ausführen kann?

tree
Code:
/home/$USER/ownCloud/java/
├── Age2.class
├── bin
│   ├── default
│   ├── generated-sources
│   │   └── annotations
│   ├── generated-test-sources
│   │   └── annotations
│   ├── main
│   │   ├── application.properties
│   │   ├── com
│   │   │   └── terashy
│   │   │       └── java
│   │   │           ├── Age2.class
│   │   │           └── JavaApplication.class
│   │   ├── graphql
│   │   └── templates
│   └── test
│       └── com
│           └── terashy
│               └── java
│                   └── JavaApplicationTests.class
├── build.gradle
├── compose.yaml
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── HELP.md
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── terashy
    │   │           └── java
    │   │               ├── Age2.class
    │   │               ├── Age2.java
    │   │               └── JavaApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── graphql
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── terashy
                    └── java
                        └── JavaApplicationTests.java
 
Also als erstes wäre es super, wenn Du uns die ganze Fehlermeldung geben würdest. Du verschweigst uns, welche Klasse nicht gefunden wurde!

Weiterhin wäre es super, wenn Du uns die Klassen zeigen würdest. Hier wäre wichtig, ob die Klassen ein Package haben oder nicht. Von der Verzeichnisstruktur wäre meine Erwartungshaltung, dass die Klassen das Package com.terashy.java haben, aber das ist jetzt geraten.

Die Klassen haben das entsprechende Package. Dann ist der volle Klassenname com.terachy.java.Age2. Du hast Age2 übersetzt aber beim java Aufruf willst Du die Klasse Age2 starten, aber er findet com.terashy.java.Age2 und daher schlägt das Starten fehl. Das was Du da machen solltest:
1. Du wechselst in das Root Verzeichnis der Sourcen, also nur ein: cd "/home/$USER/ownCloud/java/src/main/java/"
2. Beim Übersetzen musst Du jetzt den Pfad richtig angeben: javac com/terashy/java/Age2.java
3. Beim Start gibst Du dann die Klasse richtig an: java com.terashy.java.Age2
 
Also der Fehler Output ist:
Code:
❯ cd "/home/$USER/ownCloud/java/src/main/java/com/terashy/java/" && javac Age2.java && java Age2
Fehler: Hauptklasse Age2 konnte nicht gefunden oder geladen werden
Ursache: java.lang.NoClassDefFoundError: com/terashy/java/Age2 (wrong name: Age2)
und der Aufbau von Age2.java ist:
Code:
package com.terashy.java;

public class Age2 {
        System.out.println("hello world");
    }
}
Zu dem Punkt 2 und 3 redest du hier von dem Debugger?

Im Code-runner hab ich keine Option etwas einzustellen, ausser im setting unter @ext:formulahendry.code-runner

Und zu dem Debugger habe ich gerade erkannt, dass es funktioniert. Jedoch falls ich im gleichen Folder
z. B. Age3.java herstelle und den Debugger auf Age3.java ausführe, wird trotzdem nur Age2.java eingelesen.
Das wechsel auf Age2 finde nur statt, wen ich VS Code neu starte.
 
Du hast von Befehlen geschrieben, die Du auf der Console laufen lässt. Du hattest da bisher 3 Befehle, die Du mit && verknüpft hattest.
Und diese 3 Befehle sind anzupassen und das waren meine Punkte 1, 2 und 3.

Und die Fehlermeldung besagt das, was ich beschrieben hatte:
beim java Aufruf willst Du die Klasse Age2 starten, aber er findet com.terashy.java.Age2 und daher schlägt das Starten fehl.

Es ist also wichtig, dass Du bei Java klar unterscheiden kannst:
a) Den Ordner, in dem alle Sourcen liegen.
b) Die Verzeichnisstruktur, die das Package abbilden
c) Den Klassennamen, der in der Regel gleich dem Dateinamen (ohne das .java) ist

Und dann ist das Vorgehen so, dass Du entweder in das Verzeichnis mit den Sourcen wechselst oder Du das Verzeichnis entsprechend angibst (--source-path).

Und bitte verstehe auch: Das hat erst einmal absolut nichts mit einem Debugger, Visual Studio Code oder dem Gradle Projekt zu tun. Das, was wir hier besprechen, funktioniert ebenso ohne all das. Du kannst alles löschen bis auf die Age2.java und dann die entsprechenden Schritte wie beschrieben durchführen.
 
Ich bedanke mich erst mal, wie es aussieht, muss ich mich erst nochmals mit der Dokumentation befassen.

Die 3 Befehle kamen nicht von mir, die werden mit der Betätigung von "code-runner" generiert.
 
Also ich kenne mich mit Visual Studio Code nicht aus. Wenn Du mit Gradle Projekten arbeitest, dann solltest Du ein Addon/Plugin nutzen, dass Gradle unterstützt und entsprechend die Verzeichnisstruktur kennt. Bei Gradle ist es üblich, dass der Source code in src/main/java steht und daher sollte das so ausgewertet werden.

Evtl. kannst Du den Ordner java (von src/main/java - nicht den von com/terashy/java!) als Source Ordner markieren. (Evtl. hast Du etwas in der Art gemacht und dabei den falschen "java" Ordner markiert?)
 
Das Projekt hab ich über das "Spring Boot" Plugin erstellt, der Ablauf ist da eigentlich durch ein Durchklicken eigentlich selbsterklärend. Das Gleiche Fehlverhalten im Terminal hab ich aber auch, wenn ich das populäre "Maven for Java" nutze und in der .java File "package com.usw;" stehen habe.

Ich befürchte, der Fehler liegt irgendwo in meinem Terminal setting.
 
Also der Fehler Output ist:
Code:
❯ cd "/home/$USER/ownCloud/java/src/main/java/com/terashy/java/" && javac Age2.java && java Age2
Fehler: Hauptklasse Age2 konnte nicht gefunden oder geladen werden
Ursache: java.lang.NoClassDefFoundError: com/terashy/java/Age2 (wrong name: Age2)
und der Aufbau von Age2.java ist:
Code:
package com.terashy.java;

public class Age2 {
        System.out.println("hello world");
    }
}
Zu dem Punkt 2 und 3 redest du hier von dem Debugger?

Im Code-runner hab ich keine Option etwas einzustellen, ausser im setting unter @ext:formulahendry.code-runner

Und zu dem Debugger habe ich gerade erkannt, dass es funktioniert. Jedoch falls ich im gleichen Folder
z. B. Age3.java herstelle und den Debugger auf Age3.java ausführe, wird trotzdem nur Age2.java eingelesen.
Das wechsel auf Age2 finde nur statt, wen ich VS Code neu starte.

Java:
package com;

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Angenommen, es existiert cd C:/projects und HelloWorld.class ist in C:/projects/com, dann startet man nach javac mit:
java com.HelloWorld

Deshalb komm der NoClassDefFoundError. Dein Aufruf ist falsch ...&& java Age2 müsste ...&& java com.terashy.java.Age2 lauten und natürlich ist dann der Ordner falsch: cd "/home/$USER/ownCloud/java/src/main/java/com/terashy/java/" -> cd "/home/$USER/ownCloud/java/src/main/java/"
Ich vermute du hast den Starter von VSCode mit dem falschen Pfad erstellt und VSCode hat sich diesen falschen Pfad gemerkt.
 
well, danke euch beiden, ich hab das Problem gefunden.
In VS code gibt es den "Run Code" Befehl, den hab ich auf die Taste F5 gelegt, und dabei immer wieder den Befehl ausgeführt. Das funktioniert so auch bei einem Einzellen .java File der nicht in einem Projekt ist.
Jedoch in einem Java Projekt funktioniert der "Run Java" Befehl

Den hab ich jetzt auch auf die F5 gepackt, mit der Bedienung javaProjectExplorer.active == 'jarExplorer.active' || inDebugMode != 'inDebugMode'

danke nochmals
 

Zurück
Oben