Hallo!
Einleitung
Ich habe Java über Eclipse zwar schon vor einigen Jahren hin und wieder benutzt, aber eigentlich wusste ich nie so wirklich
bescheid, über Projekte, Namespacing, Verzeichnisstruktur, was ist eine Workbench? Ich war froh, wenn mein Projekt
irgendwie fehlerfrei kompiliert wurde. Von Maven hatte ich schon mal gehört, aber die Lernkurve schien mir zu steil,
da ich ja eigentlich Ruby programmiert habe. In Java habe ich nur hin und wieder Tutorials über Animationen
gemacht, was es in Ruby nicht gibt. Und Beispiel-Implementierungen zu Graphen und Graphalgorithmen und auch noch
ein paar andere kleine Sachen. Diese konnte ich zwar kompilieren und zum Laufen bringen, aber das war mehr, wie
bei Tekken einfach wild auf Knöpfe drücken. Ich wusste nicht wirklich, was die Symbole in Eclipse zu bedeuten haben.
Ich habe nun aber die ersten Schritte in Maven getan und würde gerne genauer bescheid wissen über "die" Java Verzeichnisstruktur,
Projektstruktur, Libraries und Module.
Leider geben die Oracle Docs diesbezüglich (offensichtlich?) nicht sehr viel her, weshalb ich hier nachfrage!
So viel ich aber bisher herausgefunden habe, gibt es scheinbar nicht eine Antwort auf die Frage nach "der Java Verzeichnisstruktur".
Laut den Oracle Docs gibt es nur "IDE Templates" aus verschiedenen Kategorien. Für die Standardkategorie "Standard Java Applications" symbolisiert durch ein Icon einer Tasse Java-Kaffee bieten die Docs
1. Java Application - An empty Java SE project with a main class.
2. Java Class Library - An empty Java class library with no main class.
3. Java Project with Existing Sources - A Java SE project with existing sources.
zur Auswahl an.¹
Es gibt offenbar nur gewisse Primitive und der Rest sind schätze ich Optionen beim Aufruf von der Java VM. Dazwischen ist eigentlich
eine IDE bzw. ein Buildmanager. Es scheint nicht einmal Konventionen einer vorgegebene Verzeichnisstruktur zu geben. Außer für die Benennung von Modulen und den in diesen vorkommenden Projekten sowie der Notwendigkeit von einem Module descriptor 'module-info.java', in der
u.a. Projekte aus dem vorliegenden Modul mit dem escape keyword in ein .jar Archiv exportiert werden und mit dem Projekte, von denen das vorliegende Modul-Projekt (transitiv) abhängig ist mit dem include keyword geladen werden können.
Wobei ich nicht weiss, inwieweit diese Konventionen (fuer Module) nicht auch durch IDE oder Buildmanager vorgegeben sind.
Was Java sicher vorgibt, ist, welche Zeichen dieses und jenes beinhalten darf.
Die Verzeichnisstruktur scheint jedenfalls generell blosse Konvention des jeweiligen Buildmanagers oder der IDE zu sein.
Gut, bei C/Cpp wird eine Verzeichnisstruktur etc. auch erst durch ein Makefile festgelegt.
Trotzdem: Gibt es denn nicht auch Konventionen für ein Verzeichnisse für Vanilla Java (zumindest für die o.g. templates) ?
Vielleicht sogar mit dem Prädikat »best-practice« ?
Ich habe da im Sinn, daß jede Datei den Namen der Klasse in ihr tragen muss, welche main() implementiert. Irgendeine
Regel zu Ordnern gab es auch, aber die fällt mir nicht mehr ein.
Und gibt es umgekehrt z.B. Konventionen für Verzeichnisstrukturen von Buildmanagern für Class Libraries statt für ausführbare Projekte?
Standalone oder nicht
In dem Tutorial über Module unten² ist die Rede davon, ein Modul als standalone Applikation laufen zu lassen oder nicht.
Wann kann ein Projekt, ein Modul, eine Library als standalone Applikation laufen und wann nicht?
Classpath, Root folder & Workbenches?
Ich weiß, wie man die Variable unter Ubuntu setzt, d.h., denke ich. Ich würde sie in ~/.profile setzen.
Aber was ist das, was dort festgelegt wird, eine (von mehreren) "Projekt-root-foldern" ?
Ist das, was der classpath festlegt, eine (von mehreren) "workbenches" ?
Und was wird dort festgelegt? Zum Beispiel das umgebende Verzeichnis, in dem der Benutzer alle Java-Projekte / Klassen /
Library / whatnot Verzeichnisstrukturen plaziert, das aber selbst extern zu diesen ist? Oder etwa der Anfang von
Verzeichnisstrukturen so wie com.mybusiness.... Ich habe gelesen es werden dort auch .jar Archive angehängt bzw.
diese und deren Main-Funktion.
Module
Zu Modulen und Verzeichnisstrukturen bzw. Namenskonventionen finde ich als beste Quelle nur http://tutorials.jenkov.com/java/modules.html², ich weiß aber nicht, in wieweit die dort genannten Konventionen irgendeinem offiziellen Java Standard
entsprechen oder ob dies auch nur wieder irgendwelche Konventionen sind. Aber zumindest der Verzeichnisname
eines Moduls scheint konventional festgelegt zu sein auf Punkte als Trennzeichen und ein '_' scheint verboten zu sein
als reserviertes Zeichen.
Gibt es noch andere feste Konventionen, für Namen von Modul-, Projekt-, oder Library Verzeichnis-Namenssegmente?
Als Standard für die Verzeichnisstruktur wird dort folgende allgemeine Form beschrieben:
Wobei das Verzeichnis mit den Punkten das Modul symbolisiert und die Sektion mit den Slashes einen Projekt Verzeichnisbaum.
Als root Verzeichnisname wird offenbar
angegeben (kein Verzeichnisbaum).
Jedes Modul in diesem root-Verzeichnis hat dann ein eigenes "module-root" Verzeichnis
Das wäre also, wenn ich das richtig verstehe, ein Java-Root + Module-Root
Und mit einem Modul dann Java-Root + Module-Root + Module
Aber eigentlich komme ich ab hier nicht mehr wirklich mit. ("The directory structure for the above Java package contained in a Java module of the same name, would look like this:")
Das macht für mich keinen Sinn. Dann würden .class oder .java Dateien (? s.o.) also entweder in
oder in "package root" oder in "subpackage" gelagert werden?
Java-Root + Module-Root + Module + package root + subpackage
Der Module descriptor würde unter Java-Root + Module-Root positioniert werden?
Ist der Name "module-info.java" feste Konvention oder kann der Module descriptor auch anders heißen?
Sind die module exports und imports nur einmal anzugeben oder auch auf per-package/per-subpackage basis?
Output folders
Kann ich (auch ohne BuildManager) für eine normale Package- oder auch eine Library Struktur oder aber in einer Modul-Struktur auch den Ausgangsort für z.B. deren "gepackte" Versionen wie .jar-Archive etc. (s.u.) z.B. auf Projektebene festlegen ?
Beziehungsweise:
Kann ich das mit Buildmanager?
Kann man Module und genestete Projektstrukturen oder Libraries kombinieren oder sind Module ein kompletter Ersatz für die traditionelle genestete die traditionelle genestete Projektstruktur?
Libraries
Was ist eine Library im Vergleich zu einem Package? Daß eine library keine main() Funktion implementiert?
Dateiformate
Haben "gepackte" (was ist der richtige Ausdruck?) Module und Bibliotheken andere Dateiformate als .jar-Archive ?
Wenn ja, welche?
Vielen Dank !
Mit besten Grüßen
von Spotz
Einleitung
Ich habe Java über Eclipse zwar schon vor einigen Jahren hin und wieder benutzt, aber eigentlich wusste ich nie so wirklich
bescheid, über Projekte, Namespacing, Verzeichnisstruktur, was ist eine Workbench? Ich war froh, wenn mein Projekt
irgendwie fehlerfrei kompiliert wurde. Von Maven hatte ich schon mal gehört, aber die Lernkurve schien mir zu steil,
da ich ja eigentlich Ruby programmiert habe. In Java habe ich nur hin und wieder Tutorials über Animationen
gemacht, was es in Ruby nicht gibt. Und Beispiel-Implementierungen zu Graphen und Graphalgorithmen und auch noch
ein paar andere kleine Sachen. Diese konnte ich zwar kompilieren und zum Laufen bringen, aber das war mehr, wie
bei Tekken einfach wild auf Knöpfe drücken. Ich wusste nicht wirklich, was die Symbole in Eclipse zu bedeuten haben.
Ich habe nun aber die ersten Schritte in Maven getan und würde gerne genauer bescheid wissen über "die" Java Verzeichnisstruktur,
Projektstruktur, Libraries und Module.
Leider geben die Oracle Docs diesbezüglich (offensichtlich?) nicht sehr viel her, weshalb ich hier nachfrage!
So viel ich aber bisher herausgefunden habe, gibt es scheinbar nicht eine Antwort auf die Frage nach "der Java Verzeichnisstruktur".
Laut den Oracle Docs gibt es nur "IDE Templates" aus verschiedenen Kategorien. Für die Standardkategorie "Standard Java Applications" symbolisiert durch ein Icon einer Tasse Java-Kaffee bieten die Docs
1. Java Application - An empty Java SE project with a main class.
2. Java Class Library - An empty Java class library with no main class.
3. Java Project with Existing Sources - A Java SE project with existing sources.
zur Auswahl an.¹
Es gibt offenbar nur gewisse Primitive und der Rest sind schätze ich Optionen beim Aufruf von der Java VM. Dazwischen ist eigentlich
eine IDE bzw. ein Buildmanager. Es scheint nicht einmal Konventionen einer vorgegebene Verzeichnisstruktur zu geben. Außer für die Benennung von Modulen und den in diesen vorkommenden Projekten sowie der Notwendigkeit von einem Module descriptor 'module-info.java', in der
u.a. Projekte aus dem vorliegenden Modul mit dem escape keyword in ein .jar Archiv exportiert werden und mit dem Projekte, von denen das vorliegende Modul-Projekt (transitiv) abhängig ist mit dem include keyword geladen werden können.
Wobei ich nicht weiss, inwieweit diese Konventionen (fuer Module) nicht auch durch IDE oder Buildmanager vorgegeben sind.
Was Java sicher vorgibt, ist, welche Zeichen dieses und jenes beinhalten darf.
Die Verzeichnisstruktur scheint jedenfalls generell blosse Konvention des jeweiligen Buildmanagers oder der IDE zu sein.
Gut, bei C/Cpp wird eine Verzeichnisstruktur etc. auch erst durch ein Makefile festgelegt.
Trotzdem: Gibt es denn nicht auch Konventionen für ein Verzeichnisse für Vanilla Java (zumindest für die o.g. templates) ?
Vielleicht sogar mit dem Prädikat »best-practice« ?
Ich habe da im Sinn, daß jede Datei den Namen der Klasse in ihr tragen muss, welche main() implementiert. Irgendeine
Regel zu Ordnern gab es auch, aber die fällt mir nicht mehr ein.
Und gibt es umgekehrt z.B. Konventionen für Verzeichnisstrukturen von Buildmanagern für Class Libraries statt für ausführbare Projekte?
Standalone oder nicht
In dem Tutorial über Module unten² ist die Rede davon, ein Modul als standalone Applikation laufen zu lassen oder nicht.
Wann kann ein Projekt, ein Modul, eine Library als standalone Applikation laufen und wann nicht?
Classpath, Root folder & Workbenches?
Ich weiß, wie man die Variable unter Ubuntu setzt, d.h., denke ich. Ich würde sie in ~/.profile setzen.
Aber was ist das, was dort festgelegt wird, eine (von mehreren) "Projekt-root-foldern" ?
Ist das, was der classpath festlegt, eine (von mehreren) "workbenches" ?
Und was wird dort festgelegt? Zum Beispiel das umgebende Verzeichnis, in dem der Benutzer alle Java-Projekte / Klassen /
Library / whatnot Verzeichnisstrukturen plaziert, das aber selbst extern zu diesen ist? Oder etwa der Anfang von
Verzeichnisstrukturen so wie com.mybusiness.... Ich habe gelesen es werden dort auch .jar Archive angehängt bzw.
diese und deren Main-Funktion.
Module
Zu Modulen und Verzeichnisstrukturen bzw. Namenskonventionen finde ich als beste Quelle nur http://tutorials.jenkov.com/java/modules.html², ich weiß aber nicht, in wieweit die dort genannten Konventionen irgendeinem offiziellen Java Standard
entsprechen oder ob dies auch nur wieder irgendwelche Konventionen sind. Aber zumindest der Verzeichnisname
eines Moduls scheint konventional festgelegt zu sein auf Punkte als Trennzeichen und ein '_' scheint verboten zu sein
als reserviertes Zeichen.
Gibt es noch andere feste Konventionen, für Namen von Modul-, Projekt-, oder Library Verzeichnis-Namenssegmente?
Als Standard für die Verzeichnisstruktur wird dort folgende allgemeine Form beschrieben:
com.jenkov.mymodule/com/jenkov/mymodule
Notice the fullstops (.) in the module root directory name. These fullstops need to be there because they are part of the module name! They are not to be interpreted as subdirectory path dividers!
Wobei das Verzeichnis mit den Punkten das Modul symbolisiert und die Sektion mit den Slashes einen Projekt Verzeichnisbaum.
Als root Verzeichnisname wird offenbar
'src/main/java/com'
angegeben (kein Verzeichnisbaum).
From Java 9 a module can be nested under a root directory with the same name as the module.
Jedes Modul in diesem root-Verzeichnis hat dann ein eigenes "module-root" Verzeichnis
src/main/java/com.jenkov.module1
src/main/java/com.jenkov.module2
Das wäre also, wenn ich das richtig verstehe, ein Java-Root + Module-Root
Und mit einem Modul dann Java-Root + Module-Root + Module
src/main/java/com.jenkov.module1/com/jenkov/mymodule
Aber eigentlich komme ich ab hier nicht mehr wirklich mit. ("The directory structure for the above Java package contained in a Java module of the same name, would look like this:")
Das macht für mich keinen Sinn. Dann würden .class oder .java Dateien (? s.o.) also entweder in
src/main/java/com
oder in "package root" oder in "subpackage" gelagert werden?
Java-Root + Module-Root + Module + package root + subpackage
src/main/java/com.jenkov.module1/com/jenkov/mymodule/subpackage
Der Module descriptor würde unter Java-Root + Module-Root positioniert werden?
src/main/java/com.jenkov.module1/module-info.java
Ist der Name "module-info.java" feste Konvention oder kann der Module descriptor auch anders heißen?
Sind die module exports und imports nur einmal anzugeben oder auch auf per-package/per-subpackage basis?
Output folders
Kann ich (auch ohne BuildManager) für eine normale Package- oder auch eine Library Struktur oder aber in einer Modul-Struktur auch den Ausgangsort für z.B. deren "gepackte" Versionen wie .jar-Archive etc. (s.u.) z.B. auf Projektebene festlegen ?
Beziehungsweise:
Kann ich das mit Buildmanager?
Kann man Module und genestete Projektstrukturen oder Libraries kombinieren oder sind Module ein kompletter Ersatz für die traditionelle genestete die traditionelle genestete Projektstruktur?
Libraries
Was ist eine Library im Vergleich zu einem Package? Daß eine library keine main() Funktion implementiert?
Dateiformate
Haben "gepackte" (was ist der richtige Ausdruck?) Module und Bibliotheken andere Dateiformate als .jar-Archive ?
Wenn ja, welche?
Vielen Dank !
Mit besten Grüßen
von Spotz