LlaMA, KI, java-llama.cpp

nocheinPoet

Mitglied
Moin,

ich beschäftige mich aktuell ein wenig mit KI und habe lokal nun was zum Laufen bekommen, konkret "text-generation-webui-main" was aber mit Python arbeitet. So wirklich mag ich Python nicht, der Syntax ist schon etwas schludrig, aber ist ja eine Frage des persönlichen Geschmacks.

Nun habe ich mal geschaut, was es da so für Java gibt und wurde hier fündig:


Habe ich mir mit git so mal nach Eclipse gezogen und alles soweit ohne Fehler und der build läuft auch sauber durch. Beim Testen gibt es aber diesen Fehler:
Java:
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running de.kherud.llama.[1mLlamaModelIT[m
[ERROR] [1;31mTests [0;1mrun: [0;1m1[m, Failures: 0, [1;31mErrors: [0;1;31m1[m, Skipped: 0, Time elapsed: 0.125 s[1;31m <<< FAILURE![m -- in de.kherud.llama.[1mLlamaModelIT[m
[ERROR] de.kherud.llama.LlamaModelIT -- Time elapsed: 0.117 s <<< ERROR!
java.lang.ExceptionInInitializerError
    at de.kherud.llama.LlamaModelIT.setup(LlamaModelIT.java:22)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
    at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
Caused by: java.nio.file.InvalidPathException: Illegal char <"> at index 0: "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
    at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
    at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
    at java.base/java.nio.file.Path.of(Path.java:148)
    at java.base/java.nio.file.Paths.get(Paths.java:69)
    at de.kherud.llama.LlamaLoader.loadNativeLibrary(LlamaLoader.java:132)
    at de.kherud.llama.LlamaLoader.initialize(LlamaLoader.java:65)
    at de.kherud.llama.LlamaModel.<clinit>(LlamaModel.java:29)
    ... 19 more

[INFO]
[INFO] Results:
[INFO]
[ERROR] [1;31mErrors: [m
[ERROR] [1;31m  LlamaModelIT.setup:22 ExceptionInInitializer[m
[INFO]
[ERROR] [1;31mTests run: 1, Failures: 0, Errors: 1, Skipped: 0[m
[INFO]
[INFO]
[INFO] [1m--- [0;32mfailsafe:3.2.3:verify[m [1m(default)[m @ [36mllama[0;1m ---[m
[INFO] [1m------------------------------------------------------------------------[m
[INFO] [1;31mBUILD FAILURE[m
[INFO] [1m------------------------------------------------------------------------[m
[INFO] Total time:  5.415 s
[INFO] Finished at: 2023-12-26T19:21:12+01:00
[INFO] [1m------------------------------------------------------------------------[m
[ERROR] Failed to execute goal [32morg.apache.maven.plugins:maven-failsafe-plugin:3.2.3:verify[m [1m(default)[m on project [36mllama[m: [1;31m[m
[ERROR] [1;31m[m
[ERROR] [1;31mPlease refer to D:\DEV\64\workspace\llama\java-llama.cpp\target\failsafe-reports for the individual test results.[m
[ERROR] [1;31mPlease refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.[m
[ERROR] -> [1m[Help 1][m
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the [1m-e[m switch.
[ERROR] Re-run Maven using the [1m-X[m switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [1m[Help 1][m http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Starte ich das MainExamle direkt:
Code:
package examples;

import de.kherud.llama.ModelResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import de.kherud.llama.InferenceParameters;
import de.kherud.llama.LlamaModel;
import de.kherud.llama.ModelParameters;

public class MainExample {

    public static void main(String... args) throws IOException
    {
        System.out.println(args);
        
        LlamaModel.setLogger((level, message) -> System.out.print(message));

        ModelParameters modelParams = new ModelParameters()
                .setNGpuLayers(43);
        InferenceParameters inferParams = new InferenceParameters()
                .setTemperature(0.7f)
                .setPenalizeNl(true)
//                .setNProbs(10)
                .setMirostat(InferenceParameters.MiroStat.V2)
                .setAntiPrompt("User:");
        String modelName = System.getProperty("model.name");
        String modelPath = ModelResolver.getPathToModel(modelName);
        String system = "This is a conversation between User and Llama, a friendly chatbot.\n" +
                "Llama is helpful, kind, honest, good at writing, and never fails to answer any " +
                "requests immediately and with precision.\n\n" +
                "User: Hello Llama\n" +
                "Llama: Hello.  How may I help you today?";
                ;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
        try (LlamaModel model = new LlamaModel(modelPath, modelParams)) {
            System.out.print(system);
            String prompt = system;
            while (true) {
                prompt += "\nUser: ";
                System.out.print("\nUser: ");
                String input = reader.readLine();
                prompt += input;
                System.out.print("Llama: ");
                prompt += "\nLlama: ";
//                String answer = model.complete(prompt, inferParams);
//                System.out.print(answer);
//                prompt += answer;
                for (LlamaModel.Output output : model.generate(prompt, inferParams)) {
                    System.out.print(output);
                    prompt += output;
                }
            }
        }
    }
}

bekomme ich diese Fehlermeldung:
Code:
[Ljava.lang.String;@4517d9a3
Exception in thread "main" java.lang.ExceptionInInitializerError
    at examples.MainExample.main(MainExample.java:19)
Caused by: java.nio.file.InvalidPathException: Illegal char <"> at index 0: "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
    at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
    at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
    at java.base/java.nio.file.Path.of(Path.java:148)
    at java.base/java.nio.file.Paths.get(Paths.java:69)
    at de.kherud.llama.LlamaLoader.loadNativeLibrary(LlamaLoader.java:132)
    at de.kherud.llama.LlamaLoader.initialize(LlamaLoader.java:65)
    at de.kherud.llama.LlamaModel.<clinit>(LlamaModel.java:29)
    ... 1 more
So, dazu sei gesagt, ich habe hier "D:\DEV\64\java\oracle\jdk1.8.0_131" ein jdk liegen, nutze das aber eigentlich nicht, habe das Projekt und alles schon auf "D:\DEV\64\java\oracle\jdk-21.0.1" umgestellt. Ich habe erstmal keine Ahnung, wo er sich diesen Pfad mit dem "jdk1.8.0_131" überhaut noch herholt.

Dennoch hab ich mal "llama.dll" nach "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\" kopiert, hätte ja helfen können, hat es aber nicht.

Nun bin ich dann in den Debugger und wollte mal sehen, wo zum ... er sich diesen Pfad zieht und was da nun falsch sein soll. Aber keine Chance, ich starte in der Klasse:
Code:
package examples;

import de.kherud.llama.ModelResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import de.kherud.llama.InferenceParameters;
import de.kherud.llama.LlamaModel;
import de.kherud.llama.ModelParameters;

public class MainExample {

    public static void main(String... args) throws IOException
    { 
        LlamaModel.setLogger((level, message) -> System.out.print(message));

        ModelParameters modelParams = new ModelParameters()
                .setNGpuLayers(43);
        InferenceParameters inferParams = new InferenceParameters()
                .setTemperature(0.7f)
                .setPenalizeNl(true)
//                .setNProbs(10)
                .setMirostat(InferenceParameters.MiroStat.V2)
                .setAntiPrompt("User:");
        String modelName = System.getProperty("model.name");
        String modelPath = ModelResolver.getPathToModel(modelName);
        String system = "This is a conversation between User and Llama, a friendly chatbot.\n" +
                "Llama is helpful, kind, honest, good at writing, and never fails to answer any " +
                "requests immediately and with precision.\n\n" +
                "User: Hello Llama\n" +
                "Llama: Hello.  How may I help you today?";
                ;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
        try (LlamaModel model = new LlamaModel(modelPath, modelParams)) {
            System.out.print(system);
            String prompt = system;
            while (true) {
                prompt += "\nUser: ";
                System.out.print("\nUser: ");
                String input = reader.readLine();
                prompt += input;
                System.out.print("Llama: ");
                prompt += "\nLlama: ";
//                String answer = model.complete(prompt, inferParams);
//                System.out.print(answer);
//                prompt += answer;
                for (LlamaModel.Output output : model.generate(prompt, inferParams)) {
                    System.out.print(output);
                    prompt += output;
                }
            }
        }
    }
}
Dann geht es nach:
Code:
LlamaModel.setLogger((level, message) -> System.out.print(message));
Und weiter:
Code:
    /**
     * Sets a callback for both Java and C++ log messages. Can be set to {@code null} to disable logging.
     *
     * @param callback a method to call for log messages
     */
    public static native void setLogger(@Nullable BiConsumer<LogLevel, String> callback);
Und das war es, egal wie ich es versuche, ich lande mit dem Debugger dann immer:
Code:
package sun.nio.fs;

import java.nio.file.InvalidPathException;

/**
 * A parser of Windows path strings
 */

class WindowsPathParser {
 
...

   /**
     * Remove redundant slashes from the rest of the path, forcing all slashes
     * into the preferred slash.
     */
    private static String normalize(StringBuilder sb, String path, int off) {
        int len = path.length();
        off = nextNonSlash(path, off, len);
        int start = off;
        char lastC = 0;
        while (off < len) {
            char c = path.charAt(off);
            if (isSlash(c)) {
                if (lastC == ' ')
                    throw new InvalidPathException(path,
                                                   "Trailing char <" + lastC + ">",
                                                   off - 1);
                sb.append(path, start, off);
                off = nextNonSlash(path, off, len);
                if (off != len)   //no slash at the end of normalized path
                    sb.append('\\');
                start = off;
            } else {
                if (isInvalidPathChar(c))
                    throw new InvalidPathException(path,
                                                   "Illegal char <" + c + ">",
                                                   off);
                lastC = c;
                off++;
            }
        }
        if (start != off) {
            if (lastC == ' ')
                throw new InvalidPathException(path,
                                               "Trailing char <" + lastC + ">",
                                               off - 1);
            sb.append(path, start, off);
        }
        return sb.toString();
    }

in der Funktion
Code:
String normalize(StringBuilder sb, String path, int off)

Ich würde ja gerne einen Breakpoint ind der Funktion hier setzten:
Code:
    /**
     * Remove redundant slashes from the rest of the path, forcing all slashes
     * into the preferred slash.
     */
    private static String normalize(StringBuilder sb, String path, int off) {
        int len = path.length();
        off = nextNonSlash(path, off, len);
        int start = off;
        char lastC = 0;
        while (off < len) {
            char c = path.charAt(off);
            if (isSlash(c)) {
                if (lastC == ' ')
                    throw new InvalidPathException(path,
                                                   "Trailing char <" + lastC + ">",
                                                   off - 1);
                sb.append(path, start, off);
                off = nextNonSlash(path, off, len);
                if (off != len)   //no slash at the end of normalized path
                    sb.append('\\');
                start = off;
            } else {
                if (isInvalidPathChar(c))
                    throw new InvalidPathException(path,
                                                   "Illegal char <" + c + ">",
                                                   off);
                lastC = c;
                off++;
            }
        }
        if (start != off) {
            if (lastC == ' ')
                throw new InvalidPathException(path,
                                               "Trailing char <" + lastC + ">",
                                               off - 1);
            sb.append(path, start, off);
        }
        return sb.toString();
    }
... glaub ich müsste dafür aber den Quellcode der Klassen einbinden, soweit bin ich noch nicht gekommen.

Ja, das ist schon eine etwas knifflige Frage, aber eventuell gibt es ja hier doch einen echten Speziallisten, der mir hier weiterhelfen kann.

Mein Ziel ist es, einen Chat wie er in Python ja schon richtig gut läuft, über Java zu realisieren, also mehr, ich will das über ein Web-Frontend dann im Tomcat laufen lassen, mit ein wenig JSP und so. Dazu eine MySQL Datenbank, welche die Chats speichert und die ganzen Daten für die Konfiguration.

Bei "text-generation-webui-main" schaut das schon richtig gut aus, sollte doch auch mit JAVA was geben.

Also wenn mir da wer Tipps geben kann, wie ich mich weiter an den Fehler heranarbeiten kann, ich würde mich echt freuen.


Ich wünsche allen ein guten Rutsch ins neue Jahr und schöne Feiertage

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Also Du hast den Stacktrace. Da kannst Du direkt sehen, wo das Problem besteht. Den Stacktrace von unten nach oben lesen, daher ist dies wichtig:
Code:
Caused by: java.nio.file.InvalidPathException: Illegal char <"> at index 0: "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
    at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
    at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
    at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
    at java.base/java.nio.file.Path.of(Path.java:148)
    at java.base/java.nio.file.Paths.get(Paths.java:69)
    at de.kherud.llama.LlamaLoader.loadNativeLibrary(LlamaLoader.java:132)
    at de.kherud.llama.LlamaLoader.initialize(LlamaLoader.java:65)
    at de.kherud.llama.LlamaModel.<clinit>(LlamaModel.java:29)

Und da von unten nach oben einfach einmal durchgehen. Du siehst dann, dass da ein static initializer Block in LlamaModel ist, der LlamaLoader.initialize aufruft. Der versucht dann Libraries zu laden...

Dabei findet er die Library nicht und sucht da zuletzt den java.library.path durch. Der ist evtl. auf Deinem System nicht sauber gesetzt und hat Quote Zeichen (oder zumindest ein Quote Zeichen am Start).

Aber schauen wir einfach einmal die Anleitung an:
kherud/java-llama.cpp: Java Bindings for llama.cpp - A Port of Facebook's LLaMA model in C/C++ (github.com)

Da findet sich dann:

Custom llama.cpp Setup (GPU acceleration)​

This repository provides default support for CPU based inference. You can compile llama.cpp any way you want, however. In order to use your self-compiled library, set either of the JVM options:

  • de.kherud.llama.lib.path, for example -Dde.kherud.llama.lib.path=/directory/containing/lib
  • java.library.path, for example -Djava.library.path=/directory/containing/lib
This repository uses System#mapLibraryName to determine the name of the shared library for you platform. If for any reason your library has a different name, you can set it with

  • de.kherud.llama.lib.name, for example -Dde.kherud.llama.lib.name=myname.so
For compiling llama.cpp, refer to the official readme for details. The library can be built with the llama.cpp project:

Aber wichtig ist auch: Es braucht zwei Libraries:
Java:
        loadNativeLibrary("llama");
        loadNativeLibrary("jllama");

Du hast nur llama.dll erwähnt, aber es müsste auch ein jllama.dll geben. Und das cmake makefile dazu ist ja auch dabei: java-llama.cpp/CMakeLists.txt at master · kherud/java-llama.cpp (github.com)

Das ist, was ich so auf Anhieb sehe. Wenn Du alles richtig gebaut hast, dann solltest Du die zwei DLLs zur Hand haben, diese in ein Verzeichnis geben und beim Start mittels -Dde.kherud.llama.lib.path=/directory/containing/lib das Verzeichnis setzen. Und der Pfad hat da dann keine Quote Zeichen! Wenn Du in dem Pfad ein Leerzeichen hast, dann ist der ganze Parameter in Quotes zu setzen: "-Dde.kherud.llama.lib.path=/directory/containing/lib"
 

nocheinPoet

Mitglied
Moin,

okay, dass klingt ja alles schon mal sehr professionell, also ich hatte das hier:
This repository provides default support for CPU based inference. You can compile llama.cpp any way you want, however. In order to use your self-compiled library, set either of the JVM options: ...
so verstanden, dass die aktuelle Version dort erstmal nur für die CPU läuft, oder gedacht ist, aber dass man dann auch noch die GPU einbinden kann. Aktuell habe ich keine passende GPU im System. Mein KI-Chat läuft wie gesagt über Python nur über die CPU und das ist schon recht nett.

llama.dll hab ich mir so aus dem Netz gezogen, jllama.dll hab ich nicht gefunden.

Dabei findet er die Library nicht und sucht da zuletzt den java.library.path durch. Der ist evtl. auf Deinem System nicht sauber gesetzt und hat Quote Zeichen (oder zumindest ein Quote Zeichen am Start).
Ja, inzwischen hab ich schon "erkannt", dass
Java:
"D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
hier das Anführungszeichen wohl suboptimal ist.

Ich habe aber echt keine Ahnung, wo er sich diesen Pfad überhaupt sucht, kann es sein, dass er das sich aus einer Umgebungsvariable von Windows zieht?
Du die zwei DLLs zur Hand haben, diese in ein Verzeichnis geben und beim Start mittels -Dde.kherud.llama.lib.path=/directory/containing/lib das Verzeichnis setzen. Und der Pfad hat da dann keine Quote Zeichen! Wenn Du in dem Pfad ein Leerzeichen hast, dann ist der ganze Parameter in Quotes zu setzen: "-Dde.kherud.llama.lib.path=/directory/containing/lib"
Ich verstehe nicht, wie ich beim Start da was mit -D ... setzten kann. Auch ist mir nicht klar, wie er die .dll erstellt, verstehe ich das richtig, dass da auch zusätzlich noch ein C-Compiler mit dabei ist und der dann was erstellt?

Also erstmal vielen, vielen Dank für Deine schnelle und fachkundige Antwort, hätte ich ja nicht mit gerechnet.

Aktuell verzweifle ich doch ein wenig, habe viele Jahre als Entwickler mit Java und Eclipse gearbeitet, dass man in 10 Jahren so raus ist, und sich schwer zurecht findet, ärgerlich.

Was mich auch nervt, die ganzen Beispiele von GitHub in Python, die bekomme ich ohne Probleme in Eclipse zum Laufen. Spracheingabe, TextToVoice und VoiceToText und auch den Kram mit LlaMA.

Aber nicht ein Java-Projekt dass ich zum Laufen bekomme, also jetzt was mit LlaMA.

Ich habe nun inzwischen vier Projekte versucht, nicht eines mag mal starten.

1. https://github.com/kherud/java-llama.cpp

Probleme ja beschrieben.

2. https://github.com/eoctet/llama-java
3. https://github.com/mukel/llama2.java
4. https://github.com/sebicom/llamacpp4j

Auch keines der drei Projekte bekomme ich nicht zum Laufen ...

Dabei schauen die doch auch recht gut und relativ einfach aus. Eventuell liegt es an Eclipse, wobei die Programme in Python ja laufen. Ich könnte ja weiter mit Python arbeiten, aber die Sprache macht mir echt nicht wirklich Freude, die Einrückung ist doch echt daneben, der Code schaut einfach nicht so schön sauber aus wie bei JAVA.

Aber entweder liegt es an mir, oder es ist doch wo was daran wahr, dass die Dinge mit Python viel einfach umzusetzen sind als mit JAVA.

Gut, ich schaue mir das morgen mal genauer an, auch alles was Du mir so geschrieben hast, ich danke Dir noch mal ausdrücklich für Deine so schnelle und fachkundige Antwort.


Lieben Gruß und schön Feiertage

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
jllama.dll hab ich nicht gefunden.
Die wird bei dem Projekt mit gebaut. Wenn Du das Projekt herunter geladen hast, dann kannst Du es selbst bauen. Du brauchst dazu aber einiges mehr:
  • C++ Compiler
  • CMake
==> Das müsste alles Bestandteil von Visual Studio sein. Da kannst Du die Community Edition bei Dir installieren. Du brauchst halt den C++ Bereich und vermutlich muss man die Option CMake manuell hinzu fügen... Ich schaue da nachher einmal, was ich da vermuten würde, was Du im Installer aufrufen musst.

Wichtig ist: Damit Du alles im Pfad hast, musst Du eine Spezielle Shell starten. Du bekommst da bei Visual Studio mehrere Shortcuts erzeugt.

Du hast in der Projekt-Seite in der Readme auch drin, wie Du testen kannst, ob alles da ist und dann auch die Befehle zum übersetzen.

Wenn ich das CMakefile.txt richtig interpretiere, dann baut es das LLAMA auch mit. Zumindest sieht es so aus, dass es eine spezielle Version per git herunter lädt.

Aber evtl. ist es sogar einfacher, sowas per cygwin zu bauen - dann haben die libraries halt noch eine Abhängigkeit zur cygwin Library ... Die Visual Studio Umgebung ist manchmal etwas schwer durchschaubar. Da ist ein Unix-System deutlich einfacher aufgebaut (meiner Meinung nach).

dass man in 10 Jahren so raus ist, und sich schwer zurecht findet, ärgerlich.
Wobei ich hier das Problem sehe, dass zumindest diese eine Projekt recht speziell ist. Ebenso ist sehr ärgerlich, dass es keine Binaries gibt und man eben abhängig von der Platform ist.

Das ist also eine Thematik, bei der man auch mit aktueller Java Erfahrung leicht ins stolpern kommt. Das hat mit Java Entwicklung selbst halt nichts mehr zu tun.

Auch dieses Libraries suchen - ich bin bei sowas immer hin gegangen und hatte die DLLs als Ressourcen mit in der Jar, beim Start wurden diese dann in einem temporären Verzeichnis entpackt und als Dateien geladen. Dann spart man sich diesen Such und auch den Installationsaufwand ... (Und JavaFX macht das meines Wissens nach änlich).

Das erst einmal als direkte Antwort. Ich starte mal meine Windows VM und schaue mir jetzt den Visual Studio Installer an.
 

nocheinPoet

Mitglied
Moin, ...

es juckt ja in den Finger, also danke, ich komme nun mit den Debugger schon mal weiter:
Code:
@SuppressWarnings("UseOfSystemOutOrSystemErr")
class LlamaLoader {

    private static boolean extracted = false;

    /**
     * Loads the llama and jllama shared libraries
     */
    static synchronized void initialize() throws UnsatisfiedLinkError {
        // only cleanup before the first extract
        if (!extracted) {
            cleanup();
        }
        if ("Mac".equals(OSInfo.getOSName())) {
            String nativeDirName = getNativeResourcePath();
            String tempFolder = getTempDir().getAbsolutePath();
            System.out.println(nativeDirName);
            Path metalFilePath = extractFile(nativeDirName, "ggml-metal.metal", tempFolder, false);
            if (metalFilePath == null) {
                System.err.println("'ggml-metal.metal' not found");
            }
        }
        loadNativeLibrary("llama");
        loadNativeLibrary("jllama");
        extracted = true;
    }
Das hatte ich vorher nicht gesehen. Ich wühle mich mal weiter, aber noch mal als Rückmeldung, Du hast mir schon mal auf jeden Fall etwas geholfen den Code besser nachzuvollziehen.


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
So Du das mit Visual Studio probieren willst, dann wäre aus meiner Sicht im Visual Studio Installer als Gruppe auszuwählen:
Bildschirmfoto 2023-12-26 um 23.11.57.png

Alle anderen Gruppen brauchst Du nicht, so Du damit nicht explizit etwas machen willst.

An der Seite rechts findest Du dann die einzelnen Gruppen mit der Auswahl:
Bildschirmfoto 2023-12-26 um 23.12.52.png

Dort das Optional öffnen und noch zusätzlich auswählen:
Bildschirmfoto 2023-12-26 um 23.13.10.png

Alternativ kannst Du auch oben auf den Reiter "Individual components" klicken. Dann finden sich die C++ CMake tools for Windows unter der Rubrik "Compilers, build tools, and runtimes"

Um dann mit cmake etwas bauen zu können, musst Du dann im Startmenü das "x64 Native Tools Command Prompt for VS 2022" nutzen (Unter Visual Studio 2022 > Visual Studio Tools > VC). Ggf. tut es auch der Developer Command Prompt, aber ich meine mich zu erinnern, dass da nicht alle Pfade richtig gesetzt sind, weil der Prompt davon ausgeht, dass msbuild als Build System genutzt wird und da wird beim Projekt alles richtig gesetzt nur für das Projekt. Aber das hast Du ja nicht sondern Du nutzt direkt CMake und das braucht die passenden Pfade.)
 

nocheinPoet

Mitglied
Moin Konrad,

also Du bist schon eine coole Socke, wenn ich das mal so salopp sagen darf. Du gehst ja richtig tief rein und kennst Dich mit den Dingen sehr gut aus. Da ist das Forum sicher froh, dass Du hier schreibst.

Das ist damals leider etwas blöde gelaufen, habe mich einfach ausgebrannt, viele Jahre immer nur im Hotel und beim Kunden, wenn man dann älter wird, macht der Körper nicht mehr so mit. Aber egal, ich mag JAVA einfach und KI war schon immer wo für mich etwas, für das ich brenne.

Guter Freund von mir, mit Hardware jenseits der 50.000 € und professionellen Karten mit GPU ist da nun tief in der Entwicklung, beschäftigt sich aber aktuell mehr mit dem Training und dem Nachtraining der Modelle, bei dem Laufen Modelle mit 180 GB im VRAM.

Was ich da an Dialoge so zu lesen bekomme, ist faszinierend und erschreckend, es wirkt wirklich so, als ob die eine individuelle Personalität entwickeln, die eine KI ist richtig arrogant und so was von frech, auf den Hinweis, sie würde ja auf seinen Rechner laufen und er könnte sie jederzeit abschalten hat sie erwidert, klar, aber sie weiß, sie ist so was von interessant, er wird sie wieder laufen lassen.

Sie schaut auf uns Menschen herab, sieht sich als mächtige und überlegende KI.

Dazu muss man natürlich auch sagen, diese Modelle werden vorab wo eingestellt, man gibt da einen Kontext vor, er hat sie also schon bewusst so "offen" initialisiert. Leider sind viele Dialoge vertraulich und aktuell ist er auch eh im Urlaub.

Gut, war ein wenig OT, hoffe das ist nicht zu viel gewesen.

Den Path in Windows der Umgebungsvariabel habe ich mal geändert, ich vermute aber ich muss den Rechner neu starten, damit Windows das frisst. Aber ein Anführungszeichen hab ich da nicht gefunden.

So, im Debugger zeigt er mir die Klasse:
Code:
class WindowsPathParser {...}
an, aber es ist .class, der Quellcode wird angezeigt, aber ich kann keinen Breakpoint setzten. Keine Ahnung warum, früher bin ich in den Code der generierten Servlets eine JSP debuggt.

Aber immerhin bin ich ein Stück weiter, werde mir dann auch noch mal was für C installieren, auch unabhängig von Eclipse.

Habe nun auch schon überlegt, direkt in C zu arbeiten, C++ oder C#, der Code ist auf jeden Fall besser als der von Python. Keine Ahnung warum alle so auf Python stehen. Nun gut, läuft, aber es schaut grausig aus.


Lieben Gruß

Manuel




 

nocheinPoet

Mitglied
Ja was denn hier los ...

Also danke Euch beiden noch mal explizit.

Werde das machen, also auch mit C, auch mit dem Studio und/oder CLion oder Code::Blocks. Aber wie ist es, es gibt ja Plugins für Eclipse, so ja auch für Python, was ich ja installiert habe, und womit die Python Programme fett grinsend laufen.

Könnte man das mit C nicht auch über Eclipse abfackeln?

Ich mach heute aber echt erstmal Schluss, ich fange an zu schielen. o_O :cool:


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Könnte man das mit C nicht auch über Eclipse abfackeln?
Ja klar. Du kannst alles in Eclipse machen. Das ist der Vorteil von Eclipse. Aber der Nachteil ist die Komplexität wenn du es in einer Installation willst (oder ich war zu doof).

Aber zur Not einfach das Paket / den Installer von Eclipse for C++ herunter laden und nutzen. Ich hatte teilweise drei Eclipse auf dem System für JEE, RCP und C++.

Aber ich nutze in der Regel JetBrains Produkte (IntelliJ, CLion, Rider). Für CLion gibt es aber keine Community Edition. Und du brauchst noch immer einen Compiler und Co.

Ich denke, da ist Visual Studio am Ende am einfachsten.

Ansonsten steht mein Angebot im Gespräch: ich versuche es morgen zu übersetzen - dann hast du zwei DLLs, die du direkt nutzen kannst (so es dann wirklich funktioniert bei mir)
 

M.L.

Top Contributor
Unabhängig vom Compiler und der IDE gilt es aber wohl noch andere Header-Dateien zu besorgen (ansonsten: Warn- und Fehlermeldungen):

Bild_2023-12-27_133021232.png
 

KonradN

Super-Moderator
Mitarbeiter
Unabhängig vom Compiler und der IDE gilt es aber wohl noch andere Header-Dateien zu besorgen
Das CMake makefile holt per git das llama Projekt von github. Da ist das mit drin.

Ich habe aber Probleme, das mit CMake zu bauen, da ich halt einen M1 Mac habe und damit kommt er mit meiner Architektur durcheinander (Ist halt dann auch eine Windows on ARM VM, auf der Visual Studio läuft).

Da hilft es dann leider nicht, dass ich die X64 Native Tools geladen habe (Und die auch einwandfrei funktionieren würden wenn CMake da nicht selbst ständig eigene Analysen machen würde).
 

nocheinPoet

Mitglied
Moin,

habe nun mal
Code:
C/C++ Development Tools
C/C++ Development Tools SDK
in Eclipse installiert, habe das ja auch früher schon mal gemacht um ein wenig mit C++ zu spielen. Da lief das im Grunde einfach so durch. Heute hat er einige Probleme, erstmal hängt er sich beim Suchen nach der Software fast auf, er sucht es lange, eventuell ist es auch nur das Netz.

Wie dem aber auch sei, er hat keinen Compiler für C++ mit installiert, habe mir dann noch mal ein paar Tutorials für ein HelloWorld in C++ für Eclipse angesehen, und auch wie die den Support für C++ installieren, ich habe das soweit schon passend installiert.

Offenbar fehlt bei mir "Tool Chain", ich kann da nichts auswählen, ist alles leer.

Dementsprechend fehlt ihm auch was im Projekt, ...
C:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    puts("Hello World!!!");
    return EXIT_SUCCESS;
}
Er kann da die includes nicht auflösen, und compilieren geht natürlich auch nicht ohne Compiler.

Ich überlege mir nun ein Eclipse mit C++ Support direkt runterzuladen, oder C noch mal anders zu installieren, wobei ist es doch schön gefunden hätte, wenn es direkt in dieser Installation drin laufen würde. Dass es geht, weiß ich, hatte ich ja schon mal.

Dann bin ich heute Nacht noch beim Suchen auf JBang gestoßen, dass klingt auch sehr interessant, und auch auf Quarkus. Aber ich wühle mich mal weiter durch und gebe hier dann Bescheid, wie es läuft.


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Eclipse kommt meines Wissens immer ohne Toolchain. Dazu dann Visual Studio oder eine andere Toolchain (MinGW, cygwin, ...) herunter laden / installieren.

Meine Empfehlung geht klar zu Visual Studio, denn das ist für C++ unter Windows die am meisten genutzte Software und da wirst Du am ehesten Hilfe für bekommen (MSDN Foren wären da meine Empfehlung).
 

nocheinPoet

Mitglied
Eclipse kommt meines Wissens immer ohne Toolchain. Dazu dann Visual Studio oder eine andere Toolchain (MinGW, cygwin, ...) herunter laden / installieren.

Meine Empfehlung geht klar zu Visual Studio, denn das ist für C++ unter Windows die am meisten genutzte Software und da wirst Du am ehesten Hilfe für bekommen (MSDN Foren wären da meine Empfehlung).
...

Ich frage da noch mal eben kurz nach:


Ist das wirklich der übliche Weg?

Das sieht mehr nach einen Adventure aus.

Also Du schlägst vor VS einfach zu installieren, und dann auch von Eclipse den somit installierten Compiler zu nutzen?


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Also Du schlägst vor VS einfach zu installieren, und dann auch von Eclipse den somit installierten Compiler zu nutzen?
Also ich würde auch zu Visual Studio als IDE raten. Ich weiss nicht, wie gut Eclipse die Toolchains entsprechend erkennt. Evtl. sind meine Befürchtungen unnötig, aber ich würde da jetzt erwarten, dass es eine Herausforderung ist. (Aber probiere das einfach aus - evtl. geht es ja auch direkt und ich lag komplett falsch. Ich bin kein wirklicher Eclipse Nutzer und lag bei Eclipse Fragen im Forum schon öfters falsch und Nutzer wie @LimDul oder @M.L. haben da dann korrigierend eingreifen müssen.

Visual Studio bringt ja streng genommen mehrere Toolchains mit. Du hast das für
  • X86
  • x64
  • ARM64

Visual Studio lässt Dich das einstellen und dann macht es das schon. Und wenn Du auf der Kommandozeile arbeiten willst, dann hast Du Scripte, die die Umgebung entsprechend einstellt.

Wenn Du Eclipse nutzen willst, dann ist evtl. so ein Abenteuer doch der bessere Weg. Oder was ich damals gemacht habe, war die Nutzung von WSL um dann die Entwicklung selbst auf Linux zu machen.
Aber auch das hatte etwas von Abenteuer :)
 

nocheinPoet

Mitglied
Ich hatte teilweise drei Eclipse auf dem System für JEE, RCP und C++.
Ja, habe ich auch, ich mag generell auch nichts installieren, ich ziehe mir wo immer es geht nur ein Zip-File und das wird dann entpackt und in "DEV" eingegliedert.

Ich stehe sehr auf portable Anwendungen, hier mal ein Ausschnitt aus meinem Ordner für Development:

DEV.png

Da gibt es dann noch DB mit MySQL und Server mit Tomcat, JBoss und was es so gibt. Nun stricke ich mir auch noch mal VSC dazu, wie eben gesehen gibt es das auch portable. Aktuell muss ich noch mal sehen, wie das mit Git und Maven so ausschaut, beide haben sich wo auch wieder auf C noch eingenistet. Auch hat wohl Eclipse selber was in "AppData" geschrieben.

Mag ja alles wo so auch Überlegung hinter stecken, aber ich finde es nervig. Denn es geht ja anders, ich konnte damals einfach den Ordner DEV auf einen USB-Stick ziehen und dann an jedem beliebigen PC entwickeln, ohne noch was installieren zu müssen.

So, nun schau ich mir mal eclipse-cpp und vsc genauer an.
 

nocheinPoet

Mitglied
Also ich würde auch zu Visual Studio als IDE raten. ...

Visual Studio bringt ja streng genommen mehrere Toolchains mit. Du hast das für
  • X86
  • x64
  • ARM64
Visual Studio lässt Dich das einstellen und dann macht es das schon. Und wenn Du auf der Kommandozeile arbeiten willst, dann hast Du Scripte, die die Umgebung entsprechend einstellt.

Wenn Du Eclipse nutzen willst, dann ist evtl. so ein Abenteuer doch der bessere Weg. Oder was ich damals gemacht habe, war die Nutzung von WSL um dann die Entwicklung selbst auf Linux zu machen.

Aber auch das hatte etwas von Abenteuer :)
Ich stehe schon auf Abenteuer, dazu schau ich mir auch unterschiedliche Wege an, wie eben schon geschrieben, mit ist portable echt wichtig und dann auch "Convention over Configuration", schaue mir auch unterschiedliche Sprachen an.

Wie vorhin schon kurz angesprochen, sagt Dir JBang etwas?


Das muss ich mir echt noch mal genauer ansehen, scheint recht genial zu sein. Ebenso Quarkus arbeitet mit JBang zusammen, in dem Video wird gezeigt, wie er einfach in der Console mit JBang "myservice.java" anlegt (so ab 16 min), und JBang zupft sich echt alles was dafür nötig ist, selber aus dem Netz.

Auch der Support von unterschiedlichen IDEs ist recht genial, man gibt einfach Eclipse oder so an, und wenn es nicht installiert ist, zieht sich JBang alles selber. Auch mit GIT arbeitet das zusammen, bin echt gespannt, wenn ich heute noch dazu komme mir das anzusehen.


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
schau ich mir mal eclipse-cpp und vsc genauer an
Da damit da keine Unklarheiten sind:
VSC bezeichnet Visual Studio Code - eine Web basierte IDE, welche über Electron zu einer Desktop Anwendung wird. Da bekommst Du keine Toolchain installiert.

Visual Studio ist die komplette Entwicklungsumgebung für Windows, welche aus sehr vielen Programmen und Tools besteht. Da bekommst Du dann auch so Dinge wie das Windows SDK, den C++ Compiler, alle möglichen Frameworks und Libraries, ... mit. Im Gegensatz zu dem schlanken VSC hast Du daher auch mehrere GB an Platzbedarf als auch Download.

Wenn Du auf https://my.visualstudio.com schaust, dann findest Du da relativ kompakt alle wichtigen Downloads und so. So auch die Community Edition von Visual Studio.
 

KonradN

Super-Moderator
Mitarbeiter
JBang kenne ich. Das ist relativ interessant und wenn ich endlich mit JAdventure weiter komme, dann werde ich da evtl. auch mit JAdventure etwas machen. Aber das ist absolute Zukunftsmusik :)
 

nocheinPoet

Mitglied
VSC bezeichnet Visual Studio Code - eine Web basierte IDE, welche über Electron zu einer Desktop Anwendung wird. Da bekommst Du keine Toolchain installiert.

Visual Studio ist die komplette Entwicklungsumgebung für Windows, welche aus sehr vielen Programmen und Tools besteht. Da bekommst Du dann auch so Dinge wie das Windows SDK, den C++ Compiler, alle möglichen Frameworks und Libraries, ... mit. Im Gegensatz zu dem schlanken VSC hast Du daher auch mehrere GB an Platzbedarf als auch Download.

Wenn Du auf https://my.visualstudio.com schaust, dann findest Du da relativ kompakt alle wichtigen Downloads und so. So auch die Community Edition von Visual Studio.
Ja, offenkundig bringt mit weder die Eclipse Version mit C++ noch das Zip von VS Code den C++ Compiler mit.

VS Code.png

Bei VSC hab ich nun auch noch das C++ Plugin installiert, da steht schon bei, es gibt VSC C++.png
CMake und was auch immer.

Finde es auch seltsam, dass die Tutorials da auch noch über die Konsole gehen und dort dann gcc starten. Aber wie auch immer, HelloWorld.c mag bisher bei mir nicht compilieren und starten.

Was ist denn nun der "beste" Weg, im Grund bin ich der Meinung, normal würde schon das Plugin von Eclipse reichen, hatte das schwer so in Erinnerung, dass ich das damals einfach so hinzugefügt habe und schwuppdiwupp hatte ich da dann ein HelloWord.c am Laufen.

Ich habe mir nun hier bei VSC auch nur das Zip runtergeladen und dann gestartet.

Vermutlich muss ich echt wo was wie einen Compiler für C/C++ echt installieren, damit das dann wo läuft?


Schon befremdlich, wenn ich mir das hier:


nehme, dass ist von 2022, das sind zig einzelne Schritte um den Kram zu installieren, er arbeitet auf Windows 11 und da muss man zig Sachen installieren, Updaten, dann Pfade von Hand setzten, den Debugger auch installieren, dass kann es doch nicht wirklich sein?

Ich versuche das hier mal:


Und nun hab ich es wohl weiter geschafft:
mingw.png

Gut, dann werde ich nun noch mal schauen, ob ich es in Eclipse und VS Code auch eingebunden und nun zum Laufen bekomme.

Und ich schaue mir mal "JAdventure" an, kenne ich auch noch nicht.

Danke Dir für Deine fachkundige Unterstützung, bin ja gespannt, ob ich das alles dann doch noch mal komplett zum Laufen bekomme, die beiden dll Dateien erstellt werden und das ganze Teil dann läuft.

Das ist ja eigentlich auch nur der Anfang, ich will später dann einen Chat ja auf einem Server laufen lassen und mit dem Browser draufzugreifen. So wie es im Python ja ohne Probleme geht.


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Einfach mal die Frage: was spricht gegen Visual Studio? Das wurde mehrfach empfohlen und es gab bisher keine Aussage, was dagegen sprechen würde.

Unter Windows ist das der „normale“ Weg. So wie beim Mac XCode der übliche Weg ist und man unter Linux den GNU Compiler aus dem Repository nimmt.
Ä
 

nocheinPoet

Mitglied
So ...

Also ich bin schon weiter, in Eclipse wie VS werden keine Fehler selber mehr angezeigt.
Eclipse C++.pngVSC C++02.png

Aber er will es noch nicht laufen lassen.

Code:
D:\DEV\64\workspace\python\HelloC\src>gcc HelloC.cpp
D:/DEV/64/C/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MANUEL~2\AppData\Local\Temp\ccWQypy2.o:HelloC.cpp:(.text+0x22): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
D:/DEV/64/C/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MANUEL~2\AppData\Local\Temp\ccWQypy2.o:HelloC.cpp:(.text+0x34): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
D:/DEV/64/C/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MANUEL~2\AppData\Local\Temp\ccWQypy2.o:HelloC.cpp:(.rdata$.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_[.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_]+0x0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
D:/DEV/64/C/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MANUEL~2\AppData\Local\Temp\ccWQypy2.o:HelloC.cpp:(.rdata$.refptr._ZSt4cout[.refptr._ZSt4cout]+0x0): undefined reference to `std::cout'
collect2.exe: error: ld returned 1 exit status

Also auch wenn ich es in der Console direkt versuche, bekomme ich eine Fehlermeldung. Heißt, ich bin weiter, C/C++ ist nun installiert, VS Code und Eclipse wie auch die Console finden nun den Compiler und ich kann den aufrufen. Also in Eclipse nicht wirklich, da habe ich mal "Run as C++ Application" versucht, er meinte er findet den Code nicht, und kurz danach bietet er mit nicht mehr an die Datei zu starten.

Aber gut, Stück für Stück geht es weiter, solange es weiter geht ist es doch gut, nur nicht stehenbleiben.

Denke doch dass ich es morgen schaffen sollte ein HelloWorld in C laufen zu lassen. Wobei es schon doch etwas peinlich ist, dass ich mir da so einen abbreche.

Zu Deiner Frage, was gegen VS spricht, denke eine Geschmacksfrage, und wie man es gewohnt ist. In Eclipse kenne ich mich soweit recht gut aus, ich mag auch die Optik. VS schaut nicht so nice aus, also finde ich, auch is die Usability für mich nicht so das Gelbe vom Ei.

Und ich bin mir sicher, ich habe da in der Console Werbung gesehen, ... :eek:

Ja, nun, also, gut, wie dem auch immer sei, die Zeit rennt mal wieder, ich will mir noch mal das eine Projekt für LlaMA in JAVA anschauen, was doch direkt mit JBang laufen soll, dass wäre ja der Hammer, ich werde darüber berichten.


Lieben Gruß

Manuel
 

nocheinPoet

Mitglied
Versuch mal statt gcc den g++ da du ja c++ Code hast.
Ja, gute Idee, hatte gcc genommen, weil auch VS Code in der Console gcc genommen hat.

Also, ja es geht, ich habe aber eine a.exe und keine helloworld.exe bekommen. Zumindest läuft also der Compiler in der Console. Nun muss ich mal sehen, wie ich das in Eclipse und VS Code auch so zum Laufen bekomme.


Vielen Dank und lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
ich habe aber eine a.exe und keine helloworld.exe bekommen.
Das liegt daran, dass Du nichts vorgegeben hast. Wenn Du keine Zieldatei vorgibst, dann wir die Ausgabedatei a mit entsprechender Endung erzeugt. Du kannst mit -o die Ausgabedatei vorgeben, also ein g++ -o helloworld HelloC.cpp

hatte gcc genommen, weil auch VS Code in der Console gcc genommen hat.
Das ist prinzipiell mit den entsprechenden Parametern auch möglich. VSC wird den gcc mit einigen Parametern aufgerufen haben und die hättest Du auch setzen können.

Die Gnu Compiler erkennen anhand der Datei, welches Backend genommen werden muss aber die default Libraries sind unterschiedliche. Siehe dazu z.B.:
c++ - What is the difference between g++ and gcc? - Stack Overflow

Du könntest mal ausprobieren:
gcc -lstdc++ -shared-libgcc HelloC.cpp
(Nur, so Du damit herumspielen möchtest)

Das könnte schon funktionieren - die Meldungen sind auf jeden Fall Meldungen vom Linker, dass gewisse Funktionen fehlen. Evtl. reicht sogar schon einer der beiden -l Parameter.
 

nocheinPoet

Mitglied
Moin,

ja, habe mir auch schon so was gedacht, dass ich da den Namen für die .exe wohl angeben können sollte und es klappt nun so wie Du es geschrieben hast.

Code:
gcc -lstdc++ -shared-libgcc HelloC.cpp
Gibt in der Console eine Fehlermeldung und davor echt viel Text. :)

Im "Terminal" von VS Code kennt er seltsamerweise "g++" kein Stück nicht:

VSC helloworld 01.png

Auch mit JAVA mag VS Code bisher nicht zusammenarbeiten. Ich denke ist alles noch eine Frage der Configuration, der Compiler läuft auf jeden Fall in der Console, die exe eben auch, dass ist doch schon mal was. Eventuell bekomme ich ja in der Console die beiden dll erstellt.

Mal so am Rande, wir hatten damals, so 2007 rum, öfter Probleme die Entwicklungsumgebung für alle "synchron" zu halten, oft wurde dann eben alles neu installiert, weil irgendwo immer ein Wurm drin war. Wir haben damals glaub ich mit NetBeans/Eclipse und CVS und Tomcat gearbeitet und mit JSP und Struts die Anwendung entwickelt, und mit ANT gebaut.

War schon eine wilde Zeit.

Glaube einige haben dann in einer VM entwickelt, auf jeden Fall ging einiges an Zeit drauf, die Dinge bei jedem am Laufen zu halten.

Ich habe mir da dann angewöhnt, so wenig wie möglich zu installieren, alles als Zip runterladen, entpacken, ein Ordner "DEV" und der muss portable sein.

Bei den Anwendungen heute wird ja viel mit "Docker" gemacht, ich habe damit selber noch nicht weiter experimentiert, steht aber auf der Liste. So etwas sollte es auch für die Entwicklungsumgebung geben. Es fällt mir schon etwas schwer zu glauben, dass man den Compiler für C noch immer wo selber von Hand installieren muss, und einbinden.

Ich hätte da gerne was, wo man sich alles aussucht, die IDE, die Sprachen, die Server, die DB, wie mal baut, die Frameworks und dann wird die Entwicklungsumgebung "gebaut" und man bekommt einen Ordner wo alles sauber drin ist. Und der ist portable.

Dafür gibt es dann auch noch eine Datei, die genau beschreibt wie die Umgebung eben aufgebaut sein soll.

Dann könnte man bulid development.xyz aufrufen und bekommt alles fertig zum Essen auf den Teller.

Nur so eine Idee ...


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Erst einmal eine ON TOPIC Antwort. (Off Topic kommt im Anschluss)

g++ wird nicht im Pfad sein so du den nicht manuell gesetzt hast. Eclipse hat den gcc ja mit Pfad aufgerufen und das müsstest Du beim g++ auch machen.

Ob (und wenn ja: wie?) man den C++ Compiler konfiguriert in Eclipse kann ich nicht sagen. Mein Ansatz war bisher immer, dass ich entweder (unter Windows) mit msbuild (Visual Studio) oder (unter Unix / Linux) mit make / cmake gearbeitet habe.

Und da haben wir auch entsprechende Umgebungsvariablen und haben dann alles konfiguriert. Wir setzen also relativ viele Environment Variablen und damit läuft dann z.B. ein make durch.
Sowas kannst Du natürlich auch generell machen. Und dann hast Du halt im makefile sowas wie CC = g++ oder so und dann sind die Aufrufe $(CC) .... Und die ganzen Optionen sind dann auch meist so einmal gesetzt und dann hat man da halt $(CCFLAGS) oder $(LDFLAGS) und all sowas ...

Evtl. ist das ein Ansatz, der mit Eclipse auch funktioniert. Denn soweit ich mich erinnere hast Du immer eine Art Run Configuration und da kannst Du dann sehr viel mit aufnehmen... Und ich habe keine Ahnung, wie Eclipse C++ Projekte handhabt und ob es da was eigenes internes gibt....

Ich selbst mache Builds sehr oft auf der Kommandozeile. Ich arbeite da auf Arbeit mit Aliases und so und bin da sehr schnell. Ich habe da also spezielle Aliase, die bestimmte make Aufrufe absetzen und das in ein Logfile schreiben und das Logfile wird dann am Ende ausgewertet so dass ich da auf einen Blick direkt das Ergebnis bewerten kann.
 

nocheinPoet

Mitglied
Guten Abend,

so, wer hätte es gedacht (seid ehrlich ;)), ich habe es nun geschafft in Eclipse auch ein neues C++ Projekt "HelloNewWorldC" anzulegen mit dem File HelloNewWorldC.cpp und konnte das nun compilieren. Ich musste hier und da noch was in den Einstellungen spielen, so dass er automatisch die exe erstellt, wenn ich es starte. Dabei hat er das erste Mal gemeckert:

libstdc++-6.dll.png

Diese Meldung bekomme ich auch, wenn ich ein Doppelklick auf die exe im normalen Explorer mache. Es kann ja nicht gleich alles gehen.

Wie dem auch sei, so schaut es aus:

Eclipse C++ HelloNewWorldC 01.png

Und dann hab ich da noch wieder etwas an den Einstellungen gespielt, so für Start und was auch immer, und dann konnte ich es auch in Eclipse direkt starten.

Super dachte ich mir, läuft, also dann mal debuggen, das wollte er natürlich nicht einfach so eben, er meinte immer, er findet den Quellcode nicht, bot mir aber an, denn zu verlinken, aber in dem Auswahldialog leider nur Files mit ".c" und nicht mit ".cpp".

Dann hab ich noch weiter experimentiert, hier und da und dort, und siehe da, wenn man überall mal auf die Knöpfe drückt, dann kann ganz zufällig doch mal Funktion bei rauskommen. Nein, ich habe da schon doch etwas mehr mit Überlegung herumgespielt, und ja, ich kann das Programm nun sogar debuggen.

Aber es ist alles noch etwas wackelig, so wie die erste Fahrt mit dem Rad ohne Stützräder, ich muss das mehrfach wiederholen, mir dass immer wieder genau anschauen um damit dann sicherer zu werden.

Es ist halt ein Adventure, und es macht Spaß, und Stück für Stück geht es ja auch weiter.

So, nun muss ich mal sehen, ob ich das auch in VS Code so hinbekomme, auch JAVA würde ich gerne da mal testen. Ich gehe mal schwer davon aus, dass das was Eclipse so leistet, auch mit VCS geht, den Support für JAVA hab ich ja schon als Plugin eingebunden. Er zieht aktuell nur sehr seltsam ein JRE an, glaub sogar eines das in Eclipse liegt.

Gut, es läuft wie gesagt in Eclipse mit C nun kann ich ja mal schauen, ob ich die beiden dll's erstellen kann.


Lieben Gruß

Manuel
 

nocheinPoet

Mitglied
Abend Konrad,

ach ich fand alles in Deinem Beitrag schon on Topic. ;)

Und wie Du siehst, hab ich es schon gestrickt, dass es läuft. Danke Dir aber für Deinen Beitrag.

Ja, und ja, ich verstehe schon was Du so sagen willst, denke ich mal und sehe es auch so. Ich will natürlich auch immer noch auch alles so weit verstehen und beherrschen, dass ich es in der Console machen kann.

Also bei JAVA eben auch ein HelloWord.java einfach in einem ganz normalen Texteditor und Schnickschnack den Code schreiben und dann mit javac das HelloWord.class File erstellen und mit java dann starten. Und ich denke mal, so sollte man das auch mit C halten. Also das auch ganz unten beherrschen. Dann ist die IDE eben einfach richtig nett, aber man versteht wie die Welt drunter funktioniert.

Wie ich sehe unterscheidet sich hier auch Eclipse von VSC, letzteres scheint immer über die Console (Terminal) zu gehen, auch wenn es im JAVA geht. Mag sein, das Eclipse das auch verdeckt wo macht, man sieht es zumindest nicht so.


Lieben Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Dann auch von mir etwas Off Topic...
Mal so am Rande, wir hatten damals, so 2007 rum, öfter Probleme die Entwicklungsumgebung für alle "synchron" zu halten, oft wurde dann eben alles neu installiert, weil irgendwo immer ein Wurm drin war. Wir haben damals glaub ich mit NetBeans/Eclipse und CVS und Tomcat gearbeitet und mit JSP und Struts die Anwendung entwickelt, und mit ANT gebaut.
Ja, das ist ein valider Punkt. Wir hatten damals auch solche Probleme....

Wir brauchten einen speziell installierten Entwicklungsrechner ... Wir hatten dazu auch eine Dokumentation, die immer aktuell gehalten wurde und das neu Aufsetzen eines Rechners bedeuteten 2 Tage Arbeitsausfall. Und es war halt sehr viel zu installieren:
  • SQL Server (Developer Edition mit diversen Settings - wir brauchten halt einige Module davon und die mussten richtig konfiguriert sein)
  • Oracle .Net Treiber
  • Visual Studio mit bestimmten Gruppen / Optionen (Ein paar Dinge sind im .Net Bereich in NuGet Pakete gewandert, was es etwas vereinfacht
  • Diverse andere Tools, die wir brauchten ...

Wir haben dann auch einige Tools in App-V Pakete gebaut. Das hat es dann vereinfacht. Die Tools standen halt direkt alle sofort zur Verfügung. Visual Studio ist aber so komplex, dass es relativ schwer war, daraus ein App-V Paket zu machen und wir haben das dann aufgegeben.

Am Ende war unsere Lösung tatsächlich, auf VMs zu arbeiten. Die wurden dann einfach per Clone erzeugt. Das hate aber gewisse Probleme im administrativen Bereich - Das Firmen AD war für uns halt nicht administrierbar und so hatten wir eine eigene Testumgebung. Dank MSDN Subscriptions (Heute Visual Studio Subscription) hatten wir dann auch Zugriff auf Testlizenzen so dass dies kein Problem war bezüglich Lizenzen.

Aber das war halt schon einiges an Aufwand. Da ist die Java Entwicklung deutlich entspannter muss ich sagen: Es gibt lediglich Java, das vorhanden sein muss. Maven kommt automatisch über Maven Wrapper. Diverse Java Versionen sind über einfache Scripte wechselbar und können liegen wo sie wollen. IDE kann ein einfaches Kopieren und Entpacken sein (bzw. ich nutze JetBrains Produkte und da die Toolbox zur Installation. Konfiguration kann man exportieren / importieren oder gar über git laufen lassen...)

Das ist mit Visual Studio nicht vergleichbar ... auch so Dinge wie zwei Versionen parallel nutzen - geht bei Visual Studio auch halbwegs aber deutlich komplexer als bei anderen Entwicklungsumgebungen ...

Das so als mein kleiner Rückblick auf dieses Thema...
 

nocheinPoet

Mitglied
Wir hatten damals auch solche Probleme....

Wir brauchten einen speziell installierten Entwicklungsrechner ... Wir hatten dazu auch eine Dokumentation, die immer aktuell gehalten wurde und das neu Aufsetzen eines Rechners bedeuteten 2 Tage Arbeitsausfall. Und es war halt sehr viel zu installieren:
  • SQL Server (Developer Edition mit diversen Settings - wir brauchten halt einige Module davon und die mussten richtig konfiguriert sein)
  • Oracle .Net Treiber
  • Visual Studio mit bestimmten Gruppen / Optionen (Ein paar Dinge sind im .Net Bereich in NuGet Pakete gewandert, was es etwas vereinfacht
  • Diverse andere Tools, die wir brauchten ...
Wir haben dann auch einige Tools in App-V Pakete gebaut. Das hat es dann vereinfacht. Die Tools standen halt direkt alle sofort zur Verfügung. Visual Studio ist aber so komplex, dass es relativ schwer war, daraus ein App-V Paket zu machen und wir haben das dann aufgegeben.

Am Ende war unsere Lösung tatsächlich, auf VMs zu arbeiten. Die wurden dann einfach per Clone erzeugt. Das hate aber gewisse Probleme im administrativen Bereich - Das Firmen AD war für uns halt nicht administrierbar und so hatten wir eine eigene Testumgebung. Dank MSDN Subscriptions (Heute Visual Studio Subscription) hatten wir dann auch Zugriff auf Testlizenzen so dass dies kein Problem war bezüglich Lizenzen.

Aber das war halt schon einiges an Aufwand. Da ist die Java Entwicklung deutlich entspannter muss ich sagen: Es gibt lediglich Java, das vorhanden sein muss. Maven kommt automatisch über Maven Wrapper. Diverse Java Versionen sind über einfache Scripte wechselbar und können liegen wo sie wollen. IDE kann ein einfaches Kopieren und Entpacken sein (bzw. ich nutze JetBrains Produkte und da die Toolbox zur Installation. Konfiguration kann man exportieren / importieren oder gar über git laufen lassen...)

Das ist mit Visual Studio nicht vergleichbar ... auch so Dinge wie zwei Versionen parallel nutzen - geht bei Visual Studio auch halbwegs aber deutlich komplexer als bei anderen Entwicklungsumgebungen ...

Das so als mein kleiner Rückblick auf dieses Thema...
Ja, ich habe vor einigen Jahren auch was in der CT gelesen, dass man installierte Anwendungen "einpacken" und portable machen kann, aber auch recht komplex das ganze Geraffel.

Es ist schon seltsam, dass da am Ende dann echt viele wirklich die Umgebung einmal auf einer VM einrichten und dann diese duplizieren und verteilen. Natürlich ist das ein Weg, und er löst das Problem. Bei den Anwendungen ist man da früher ja auch mal so dabei gewesen und dann kam Docker.

Da müsste echt mal was geschraubt werden, ich hatte das auch schon mit Eclipse, JDK, Tomcat, MySQL, JBoss und glaube noch ein paar netten Dingen hinbekommen, wie gesagt, neue aufgesetzte VM, dann nur Zips nehmen, entpacken und konfigurieren. Dann den Ordner von der VM ziehen und es geht.

Aber auch das ist nicht perfekt, man installiert dann ja hier und da noch mal was zur IDE, kann die zerschießen. Also muss man vorher die Kopieren, damit man die in Reserve hat. Auch muss man das auf der VM mit pflegen.

Also es braucht ein System, welche die Entwicklungsumgebung portable baut und oben drauf noch eine Versionskontrolle. Sicher eine Aufgabe, will mal hoffen, dass da mal bald wer auf die Idee kommt. Denn das Problem ist ja bekannt.


Gruß

Manuel
 

nocheinPoet

Mitglied
Einen schönen Freitagmittag wünsche ich.

Ich muss da noch mal was fragen, habe nun mit JBang experimentiert, dabei tritt wieder ein Fehler auf, denn ich schon einmal hatte, dass er die Hauptklasse nicht findet und somit das JAVA File nicht starten kann. Ich habe nun alle Pfade geprüft, JAVA_HOME richtig gesetzt und auch im Path von Windows angegeben, ebenso auch den ..bin Ordner, damit er javac findet.

Hauptklasse konnte nicht gefunden werden.png

Ich weiß, dass der Fehler auch schon bei anderen aufgetreten ist, ich dachte aber, wenn ich die Pfade richtig setze und "java" wie auch "javac" in der Console aufrufen kann, sollte das doch laufen.

Der Code schaut so aus:
Java:
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.6.3


import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.util.concurrent.Callable;

@Command(name = "hello", mixinStandardHelpOptions = true, version = "hello 0.1",
        description = "hello made with jbang")
class hello implements Callable<Integer> {

    @Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
    private String greeting;

    public static void main(String... args) {
        int exitCode = new CommandLine(new hello()).execute(args);
        System.exit(exitCode);
    }

    @Override
    public Integer call() throws Exception { // your business logic goes here...
        System.out.println("Hello " + greeting);
        return 0;
    }
}

Ich habe nun eben noch mal in Eclipse ein neues JAVA-Projekt angelegt mit HelloJAVA.java:

Java:
package eu.stylelight.hello;

public class HelloJAVA {

    public static void main(String[] args)
    {
        System.out.println("HelloJAVA!");
    }
}
Den dann in Eclipse laufen lassen ohne Probleme und bin dann in die Console und habe es dort noch mal mit java und javac versucht, auch hier gibt es die Fehlermeldung, wenn auch mit mehr Informationen:

HelloJAVA.png

In Eclipse kann ich das ohne Probleme starten, er gibt dann einfach in der Console "HelloJAVA!" aus.

Jemand eventuell eine Idee, was es mit dem Fehler auf sich hat?

Anscheinend passt da was nicht mit den Versionen des Compilers.

Ich habe die Datei mit Java 21 kompiliert und versuche dann das Datei mit Java 9 laufen zu lassen, nur warum? Und das ist auch ein anderer Fehler, als der mit der Hauptklasse. Irgendwie hab ich mir die Umgebung vermurkst.

Nun hab ich mal den Pfad für Java 21 direkt angegeben:

Code:
D:\DEV\64\workspace\python\HelloJAVA\src\eu\stylelight\hello>echo %JAVA_HOME%
D:\DEV\64\java\oracle\jdk\21.0.1

D:\DEV\64\workspace\python\HelloJAVA\src\eu\stylelight\hello>D:\DEV\64\java\oracle\jdk\21.0.1\bin\java HelloJAVA
Fehler: Hauptklasse HelloJAVA konnte nicht gefunden oder geladen werden
Ursache: java.lang.NoClassDefFoundError: HelloJAVA (wrong name: eu/stylelight/hello/HelloJAVA)

D:\DEV\64\workspace\python\HelloJAVA\src\eu\stylelight\hello>

Und dann kommt wieder der Fehler, dass die Hauptklasse nicht gefunden werden kann. Schon seltsam ...


Lieben Gruß

Manuel
 
Zuletzt bearbeitet:

nocheinPoet

Mitglied
Siehe die Meldungen des Compilers aus dem Screenshot: UnsupportedClassVersionError
Ja, warum auch immer, den die Umgebungsvariablen sollten ja nun stimmen. Und selbst wenn nicht, ich habe dann ja die richtige Version von java genommen, eben den direkten Pfad für den Aufruf angegeben:

Code:
D:\DEV\64\workspace\python\HelloJAVA\src\eu\stylelight\hello>D:\DEV\64\java\oracle\jdk\21.0.1\bin\java HelloJAVA

Und dann kommt wieder der alte Fehler, dass er die Hauptklasse nicht finden kann:

Code:
Fehler: Hauptklasse HelloJAVA konnte nicht gefunden oder geladen werden
Ursache: java.lang.NoClassDefFoundError: HelloJAVA (wrong name: eu/stylelight/hello/HelloJAVA)

Ich suche da schon mehr eine Lösung des Problems.


Lieben Gruß

Manuel
 

nocheinPoet

Mitglied
So, denke mal ich habe den Fehler gefunden.

Es liegt am Package Namen in der Datei:

Code:
package eu.stylelight.hello;

public class Hello {

    public static void main(String[] args)
    {
        System.out.println("HelloJAVA!!");
    }
}
So schaut es in Eclipse aus, dort läuft es, in der Console nicht.

In der Console bin ich aber direkt auch im Ordner drin, also ../eu/stylelight/hello/.

Nun hab ich mal "package eu.stylelight.hello;" auskommentiert, und dann meckert zwar Eclipse, aber ich kann in der Console compilieren und starten. Wobei ich beide mal nun direkt den vollen Pfand zu javac und java angegeben habe.

Denke mal das Problem ist erkannt, nun muss ich noch sehen, was JBang stört und wie ich das so zusammenbekomme, dass es in der Console und in Eclipse gleich funktioniert.


Gruß

Manuel
 

KonradN

Super-Moderator
Mitarbeiter
Also generell fallen mehrere Dinge auf:

- Du hast eine JRE von Java 9 im Pfad und JDK ist Java 21. Wenn Du also mit javac etwas übersetzt, dann ist das mit java nicht ausführbar (Weil die erzeugte .class Datei halt die Version von Java 21 hat und Du es mit Java 9 öffnen willst. Hier der Tipp: Deinstalliere alle JRE und installiere nur JDKs. Ein JDK enthält auch das JRE!

- Package und Class müssen immer mit dem Pfad überein stimmen. Also wenn Du das package a.b hast und die Klasse C, dann ist der volle Name des Klasse a.b.C und es muss im Dateisystem in a/b/C.java bzw. a/b/C.class sein.

- In aktuellen Java Versionen kannst Du tatsächlich eine java Datei starten ohne diese zu übersetzen (Ab Java 14 oder so - Du solltest aber Java 17 oder 21 nehmen so Du keinen Grund hast, eine andere Version zu nutzen!) So Du also das JRE 9 deinstallierst und du dann bei java auch die Version 21 hast, dann kannst Du eine Klasse direkt starten.

- Du hast unterschiedliche hello.java Dateien. Im vorletzten Post hast Du die Klasse hello ohne Package und mit Unix Shell Anweisung für jbang in der erste Zeile. Im letzten Post ist es dann die Klasse Hello in einem Package! Da musst Du unbedingt aufpassen, was Du wo und wie hast.

- Wichtig: Klassenname und Dateiname sollte übereinstimmen (bzw. muss, wenn die Klasse public ist). Dabei ist auch die Groß-/Kleinschreibung wichtig. Klasse hello -> hello.java, Klasse Hello -> Hello.java.

Generelle Nutzung von Java:

a) Übersetzung mit javac
Der Java Compiler wird über javac gestartet. Da wird mindestens die java Datei angegeben. Das wäre also bei Dir ein Aufruf
javac hello.java
Dabei wird dann eine .class Datei erzeugt. Das Problem mit dem Package hättest Du also dann erkannt, denn er hätte dann bei der Datei des letzten Posts eine Datei eu\stylelight\hello\Hello.class erzeugt.

b) Starten der Java Anwendung
Gestartet wird mit dem java (oder unter Windows auch javaw, so man keine Konsolenbindung will) Befehl. Hier wird am Anfang oft die Klasse angegeben. Dann sucht Java selbst nach der Klasse mit dem Classloader und dazu wird im aktuellen Verzeichnis gesucht. Klasse hello -> hello.class wird gesucht. Und da muss dann auch die Klasse hello drin sein. Wenn da die Klasse a.b.hello drin ist, dann passt das nicht und Du bekommst mindestens eine Warnung.
In aktuellen Java Versionen kannst Du auch eine java Datei angeben. Also ein java hello.java Das funktioniert auch.

Wichtig: Ich habe hier Namen von Dir übernommen. Klassen sollten aber immer mit einem großen Buchstaben anfangen also nicht hello sondern Hello. Technisch ist es egal, aber das sind Namens-Konventionen, die Sun damals vorgegeben hat und die eigentlich von allen eingehalten werden.

c) JBang
Bei JBang solltest Du die Datei angeben. Also nicht jbang hello sondern jbang hello.java
(Es sei denn, Du hast es bereits übersetzt, aber die Idee ist ja aus meiner Sicht ja, dass man hier auch direkt mit den Source Dateien arbeitet und eine Art Script hat.
 

nocheinPoet

Mitglied
- Du hast eine JRE von Java 9 im Pfad und JDK ist Java 21. Wenn Du also mit javac etwas übersetzt, dann ist das mit java nicht ausführbar (Weil die erzeugte .class Datei halt die Version von Java 21 hat und Du es mit Java 9 öffnen willst. Hier der Tipp: Deinstalliere alle JRE und installiere nur JDKs. Ein JDK enthält auch das JRE!
Ja, nun, was bin ich nicht sehend, es steht ja wirklich da.

Es ist so, erst ging nur der Befehl javac, aber java hat er nicht gefunden. Mit "Version" war nichts, er fand den Befehl einfach nicht, also hab ich dann im Pfand das JDK 21 draufgegeben. Und dann fand er es, ich habe aber gar nicht mehr auf die Version geachtet, die ich mir habe anzeigen lassen. Dass ist natürlich wo echt dämlich. Ich hab da zu viele Baustellen und Gedanken um Kopf, einfach übersehen.

Nun gut, ich habe noch mal die Umgebungsvariablen angesehen und da gibt es die fürs System und für den User, bei denen im System stand das JAVA 9 drin, eine alte Installation, die sich dann da verewigt hatte. Darum mag ich so was ungerne installieren, ...

Aber hab ich eben nun geändert:

HelloJAVA 02.png

Also die Versionen sind nun beide JAVA 21, und ich kann es direkt compilieren und laufen lassen. Brauche nicht mehr dafür den vollen Pfad, nun zickt nur noch JBang etwas herum.


- Package und Class müssen immer mit dem Pfad überein stimmen. Also wenn Du das package a.b hast und die Klasse C, dann ist der volle Name des Klasse a.b.C und es muss im Dateisystem in a/b/C.java bzw. a/b/C.class sein.

- In aktuellen Java Versionen kannst Du tatsächlich eine java Datei starten ohne diese zu übersetzen (Ab Java 14 oder so - Du solltest aber Java 17 oder 21 nehmen so Du keinen Grund hast, eine andere Version zu nutzen!) So Du also das JRE 9 deinstallierst und du dann bei java auch die Version 21 hast, dann kannst Du eine Klasse direkt starten.

- Du hast unterschiedliche hello.java Dateien. Im vorletzten Post hast Du die Klasse hello ohne Package und mit Unix Shell Anweisung für jbang in der erste Zeile. Im letzten Post ist es dann die Klasse Hello in einem Package! Da musst Du unbedingt aufpassen, was Du wo und wie hast.
Ja, nun ja, ich habe die Hello.java über Eclipse zuerst angelegt und dort mit Package und das lief auch in Eclipse richtig gut. Aber nicht in der Console, da gab es den Fehler, er kann die Hauptklasse nicht finden. Ich dachte mir, es könnte am Package liegen, habe dann also die Zeile auskommentiert, was Eclipse erstmal suboptimal fand, aber das ist ja egal, ich weiß ja was stört.

Dann bin ich wieder in die Console, und nun klappt das dort, weil eben nicht mehr im File selber ein Package angegeben ist. Ich bin ja in der Console genau in dem Verzeichnis wo Hello.java liegt.

Also das ist nun so weit alles klar und nachvollziehbar, hatte Fehler in den Umgebungsvariablen, und zu blöde zu lesen was ich mir ausgeben lasse. Egal, man lernt ja daraus, immer schön die Augen auf.

Soweit ist alles nun schon grün, nur JBang findet wieder die Hauptklasse nicht.

Vermutlich liegt dass wieder daran, dass JBang was falsches anzieht oder selber noch wo hockt, mal sehen, wird schon, ich gehe mal in ein ganze frisches Verzeichnis und teste dort JBang noch mal alleine.

- Wichtig: Klassenname und Dateiname sollte übereinstimmen (bzw. muss, wenn die Klasse public ist). Dabei ist auch die Groß-/Kleinschreibung wichtig. Klasse hello -> hello.java, Klasse Hello -> Hello.java.

Generelle Nutzung von Java:

a) Übersetzung mit javac

Der Java Compiler wird über javac gestartet. Da wird mindestens die java Datei angegeben. Das wäre also bei Dir ein Aufruf

javac hello.java
Das ist soweit schon klar, Groß-/Kleinschreibung eh, das hab ich ja auch schon früher zigmal durchgespielt. Funktioniert nun ja auch perfekt.

Dabei wird dann eine .class Datei erzeugt. Das Problem mit dem Package hättest Du also dann erkannt, denn er hätte dann bei der Datei des letzten Posts eine Datei eu\stylelight\hello\Hello.class erzeugt.
Da frag ich doch noch mal lieber nach, mit Package habe ich so nie in der Console gearbeitet, ja macht man ein HelloWorld.java und gut ist es.

Aber muss ja auch mit Package gehen, ich verstehe Dich richtig, wenn ich die Zeile nicht auskommentiere, dann legt er mir dort wo ich javac Hello.java aufrufe noch mal die Ordner ..\eu\stylelight\hello an und darin das Hello.class?

Mal versuchen ...

Gestartet wird mit dem java (oder unter Windows auch javaw, so man keine Konsolenbindung will) Befehl. Hier wird am Anfang oft die Klasse angegeben. Dann sucht Java selbst nach der Klasse mit dem Classloader und dazu wird im aktuellen Verzeichnis gesucht. Klasse hello -> hello.class wird gesucht. Und da muss dann auch die Klasse hello drin sein. Wenn da die Klasse a.b.hello drin ist, dann passt das nicht und Du bekommst mindestens eine Warnung.

In aktuellen Java Versionen kannst Du auch eine java Datei angeben. Also ein java hello.java Das funktioniert auch.

Wichtig: Ich habe hier Namen von Dir übernommen. Klassen sollten aber immer mit einem großen Buchstaben anfangen also nicht hello sondern Hello. Technisch ist es egal, aber das sind Namens-Konventionen, die Sun damals vorgegeben hat und die eigentlich von allen eingehalten werden.
Ja, ich weiß, Konventionen, Klassennamen großschreiben, find ich auch gut so.

c) JBang
Bei JBang solltest Du die Datei angeben. Also nicht jbang hello sondern jbang hello.java
(Es sei denn, Du hast es bereits übersetzt, aber die Idee ist ja aus meiner Sicht ja, dass man hier auch direkt mit den Source Dateien arbeitet und eine Art Script hat.
Hab ich echt JBang hello geschrieben?

HelloJAVA 02.png

Gut, hier stimmt soweit ja doch nun alles, bis JBang, sollte doch keine große Sache sein. Und wenn es dann läuft, schau ich noch mal wie ich das mit VS Code hinbekomme, am Ende sollte das in beiden IDEs laufen, und auch in der Console und das mit Java HelloWorld und auch mit C++.

Das ist mal ein Zwischenziel, und dann schraub ich weiter an dem eigentlichen Problem und versuche da die Programme von GitHub zu erstellen.

Und ich danke Dir wieder für Deine ausführliche Antwort.


Lieben Gruß

Manuel
 

nocheinPoet

Mitglied
So, ...

Code:
D:\DEV\64\workspace\python\HelloJAVA\src>jbang init --template=cli Hello.java
[jbang] File initialized. You can now run it with 'jbang Hello.java' or edit it using 'jbang edit --open=[editor] Hello.java' where [editor] is your editor or IDE, e.g. 'codium'. If your IDE supports JBang, you can edit the directory instead: 'jbang edit . 'Hello.java. See https://jbang.dev/ide

D:\DEV\64\workspace\python\HelloJAVA\src>jbang Hello.java Max!
[jbang] Building jar for Hello.java...
Fehler: Hauptklasse Hello konnte nicht gefunden oder geladen werden
Ursache: java.lang.ClassNotFoundException: Hello

D:\DEV\64\workspace\python\HelloJAVA\src>dir
 Datenträger in Laufwerk D: ist Work
 Volumeseriennummer: 7CD5-D5A2

 Verzeichnis von D:\DEV\64\workspace\python\HelloJAVA\src

29.12.2023  19:42    <DIR>          .
29.12.2023  19:42    <DIR>          ..
29.12.2023  14:55    <DIR>          eu
29.12.2023  19:42               836 Hello.java
               1 Datei(en),            836 Bytes
               3 Verzeichnis(se), 66.328.485.888 Bytes frei

D:\DEV\64\workspace\python\HelloJAVA\src>java Hello
Fehler: Hauptklasse Hello konnte nicht gefunden oder geladen werden
Ursache: java.lang.ClassNotFoundException: Hello

D:\DEV\64\workspace\python\HelloJAVA\src>

Und JBang hat den Code erstellt:
Java:
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.6.3


import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.util.concurrent.Callable;

@Command(name = "Hello", mixinStandardHelpOptions = true, version = "Hello 0.1",
        description = "Hello made with jbang")
class Hello implements Callable<Integer> {

    @Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
    private String greeting;

    public static void main(String... args) {
        int exitCode = new CommandLine(new Hello()).execute(args);
        System.exit(exitCode);
    }

    @Override
    public Integer call() throws Exception { // your business logic goes here...
        System.out.println("Hello " + greeting);
        return 0;
    }
}
Nun gut, wird noch werden ...


Gruß

Manuel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 0
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
E java mithilfe url .jar datei öffnen Allgemeine Java-Themen 9
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
E Java .exe Datei mit args starten Allgemeine Java-Themen 2
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18

Ähnliche Java Themen

Neue Themen


Oben