static und dynamic linking?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Mhm,

kann mir bitte jemand mal ein Beispiel geben wie ich eine Lib z.B. in 123.jar statisch und wie dynamisch verlinken würde?

Besten Dank
 

foobar

Top Contributor
Öhm, statisch und dynamisch linken? DU bist wohl im falschen Märchen. Sowas gibt in C/C++ aber nicht in Java.
In Java werden Klassen mit Hilfe eines Classloaders aus Jars geladen.
 
G

Gast

Gast
In diversen Lizenzen wird immer über statisch / dynamisches linking gesprochen. Nur ich kann mir in Java keinen Reim darauf machen was das sein soll.
 

Ebenius

Top Contributor
Betrachte alle Verknüpfungen zwischen JARs als dynamisch gelinked. Das passt meines Erachtens sauber.
 

foobar

Top Contributor
In diversen Lizenzen wird immer über statisch / dynamisches linking gesprochen. Nur ich kann mir in Java keinen Reim darauf machen was das sein soll.
Das ist in Java nicht so einfach zu beantworten, weil es so viele verschiedene Möglichkeiten gibt. Wenn man z.b. in einer kommerziellen Anwendung den Mysql-Treiber (GPL) verwendet, muß man seine Anwendung aber nicht unter die GPL stellen, da man ja nur per JDBC Interfaces auf den Treiber zugreift.

Es ist aber generell nicht leicht bestimmtbar was jetzt als derived work gilt und was nicht.

Der Spring dmServer steht auch unter der GPL man kann diesen aber nutzen um kommerzielle Anwendungen zu erstellen, da man ja keine Veränderungen am Server vornimmt.

Im Einzelfall sollte man sich daher immer professionellen Rat suchen.
 
S

Spacerat

Gast
Bin mir nicht Sicher...

Statisch verlinken:
Die einzelnen Klassen eines Jar-Archives werden per "import"-Direktive eingebunden. Die erstellte Klasse läuft nur, wenn das Jar-Archiv vorhanden ist.

Dynamisch verlinken:
Auf die einzelnen Klassen eines Jar-Archives wird ausschliesslich über das Reflection-API zugegriffen. Die erstellte Klasse bleibt auch ohne das Jar-Archiv lauffähig.

mfg Spacerat
 

Ebenius

Top Contributor
Spacerat hat gesagt.:
Statisch verlinken:
Die einzelnen Klassen eines Jar-Archives werden per "import"-Direktive eingebunden. Die erstellte Klasse läuft nur, wenn das Jar-Archiv vorhanden ist.

Dynamisch verlinken:
Auf die einzelnen Klassen eines Jar-Archives wird ausschliesslich über das Reflection-API zugegriffen. Die erstellte Klasse bleibt auch ohne das Jar-Archiv lauffähig.
Entschuldige, aber das ist eine völlig unsinnige und falsche Erklärung. Lies mal in der Wikipedia, was ein Linker tut! DLLs sind dynamisch gelinkt. Funktioniert Dein Windows ohne sie?

Ebenius
 

byte

Top Contributor
Spacerat hat gesagt.:
Statisch verlinken:
Die einzelnen Klassen eines Jar-Archives werden per "import"-Direktive eingebunden. Die erstellte Klasse läuft nur, wenn das Jar-Archiv vorhanden ist.

Dynamisch verlinken:
Auf die einzelnen Klassen eines Jar-Archives wird ausschliesslich über das Reflection-API zugegriffen. Die erstellte Klasse bleibt auch ohne das Jar-Archiv lauffähig.
Das macht keinen Sinn, denn auch beim Zugriff per Reflection hast Du die entsprechenden Imports im Code.
 
S

Spacerat

Gast
@Ebenius: Kommt wohl auf die DLL an. Windows kann z.B. völlig auf eine "opengl.dll" verzichten. Was ein Linker tut ist mir durchaus bewusst. Wenn man versucht, in Java eine Klasse mit
Code:
Object o = Class.forName("javax.media.opengl.GLCanvas").newInstance();
zu instanzieren, kann man die ClassNotFoundException abfangen, weil der Klassenname komplett am Linker vorbei geht (dynamisch verlinkt). Würde man stattdessen die Klasse importieren, kann man seine eigene nichtmal kompilieren, wenn "JOGL" im ClassPath nicht gefunden wurde. Völlig "Unsinnig und Falsch" kann ich deswegen nur zurückgeben.

mfg Spacerat
 
M

maki

Gast
Spacerat,

in Java wird ausschliesslich dynamisch gelinkt.

Statisch hiesse hier dass alle benötigten Klassen etc. mit in das übersetzte Kompilat (.class Datei) gepackt (gelinkt) würden. Dynamisch bedeutet dass zur Laufzeit die benötigten Libs geladen werden (Jars, andere .class Dateien), das macht Java immer so.
In C/C++ zB. hat man die Wahl ob man statisch oder dynmisch linken will.
 

Ebenius

Top Contributor
Bei einer statisch gelinkten Applikation entsteht ein Binary. Danach kann man die Bibliothek nicht mehr von der Applikation trennen. Wenn ich jedoch gegen eine JAR-Datei kompiliere, kann ich sie nachträglich jederzeit durch eine andere (Implementation oder Version) austauschen. Damit kann in Java zwischen zwei JARs nicht statisch gelinkt sein.

Dynamisch kann man eine Anwendung auch nur Linken, wenn die entsprechenden Header-Files vorhanden sind. Die gehören normaler Weise zur selben Bibliothek mit der selben Lizenz.

Lies Dir doch den Artikel von David Turner (siehe oben) durch. Der Mann weiß, wovon er redet.

Ebenius
 

byte

Top Contributor
Ebenius hat gesagt.:
byto hat gesagt.:
Das macht keinen Sinn, denn auch beim Zugriff per Reflection hast Du die entsprechenden Imports im Code.
Das wiederum ist auch Unsinn... :lol:
Zumindest sobald Du Dich auf eine spezifische XYZ.class beziehst, brauchst Du auch den Import. Wenn man hingegen auf Typsicherheit bei Reflection pfeift, gehts auch ohne. :roll:
 

Ebenius

Top Contributor
byto hat gesagt.:
Zumindest sobald Du Dich auf eine spezifische XYZ.class beziehst, brauchst Du auch den Import. Wenn man hingegen auf Typsicherheit bei Reflection pfeift, gehts auch ohne. :roll:
Das Wort Typsicherheit passt bei Reflection allgemein nicht recht. ;-)

Ich hatte eigentlich in Bezug auf Deinen vorhergehenden Kommentar gemeint ─ und leider nicht näher ausgeführt, mein Fehler ─, dass die Erklärung keinen Sinn ergibt, weil die Tatsache, dass eine Klasse (per Import oder per qualifizierter Benennung) einer anderen bekannt gemacht wird, nichts darüber aussagt, ob sie statisch oder dynamisch gelinkt ist.

Ebenius
 

byte

Top Contributor
Ebenius hat gesagt.:
byto hat gesagt.:
Zumindest sobald Du Dich auf eine spezifische XYZ.class beziehst, brauchst Du auch den Import. Wenn man hingegen auf Typsicherheit bei Reflection pfeift, gehts auch ohne. :roll:
Das Wort Typsicherheit passt bei Reflection allgemein nicht recht. ;-)
Wieso? Siehe: Class#isInstanceOf(obj) ;-)

Ich hatte eigentlich in Bezug auf Deinen vorhergehenden Kommentar gemeint ─ und leider nicht näher ausgeführt, mein Fehler ─, dass die Erklärung keinen Sinn ergibt, weil die Tatsache, dass eine Klasse (per Import oder per qualifizierter Benennung) einer anderen bekannt gemacht wird, nichts darüber aussagt, ob sie statisch oder dynamisch gelinkt ist.
Na dann wollten wir ja genau das gleiche sagen. Schön. :cool:
 
S

Spacerat

Gast
Ebenius hat gesagt.:
Lies Dir doch den Artikel von David Turner (siehe oben) durch. Der Mann weiß, wovon er redet.
Ok... gemacht... Hab' gerade das Gefühl, dass das von dem er da schreibt zunehmend in Vergessenheit gerät. Für mich erschloss sich das statische oder dynamische Einbinden irgendwelcher Librarys bisher nur darin, die Ausfürung eines Programms von einer solchen abhängig zu machen oder nicht. Die Möglichkeit alles in ein Binary zu packen ist im übrigen auch in Java gegeben. Aber ist das Sinnvoll? Ist das OOP? Wie würdest du denn meine beiden Arten, Jar-Archive einzubinden unterscheiden? Abhängig->Unabhängig?

mfg Spacerat
 

Ebenius

Top Contributor
Spacerat, abhängig ist das Programm in beiden Fällen. Unterscheiden kannst Du's daran, ob die Bibliothek ausgetauscht werden kann (ohne einen Decompiler o.ä. zu bemühen), oder ob eine konkrete Version in der Applikation fest verdrahtet ist. Wenn Du beispielsweise alle Klassen aus der Bibliothek nimmst und sie in Dein eigenes JAR legst, dann würde ein Richter das wahrscheinlich als equivalent zum Prinzip des statischen Linkens betrachten.

Rein technisch wäre es selbst dann noch dynamisch gelinkt. Beispielsweise könnte man einfach die neuere Version der Bibliothek weiter vorn in den CLASSPATH stecken und schon würde die eingebaute (auf normalem Weg) nicht mehr benutzt.

Rein technisch gesehen sind in Java alle Verbindungen zwischen verschiedenen statischen Klassen dynamisch. Rechtlich würde man sicher eher die Grenze ziehen.

Ebenius
 

byte

Top Contributor
Wobei es keiner so genau sagen kann, denn ich bezweifel, dass es da schon Präzedenzfälle in Deutschland gibt.
 
G

Guest

Gast
Da habe ich ja eine Diskussion losgetreten.

Dennoch habe ich es nicht ganz verstanden:

The typical arrangement for Java is that each library an application uses is distributed as a separate JAR (Java Archive) file. Applications use Java's “import” functionality to access classes from these libraries. When the application is compiled, function signatures are checked against the library, creating a link. The application is then generally a derivative work of the library. So, the copyright holder for the library must authorize distribution of the work. The LGPL permits this distribution.

If you distribute a Java application that imports LGPL libraries, it's easy to comply with the LGPL. Your application's license needs to allow users to modify the library, and reverse engineer your code to debug these modifications

Wenn ich es richtig übersetzt habe steht im ersten Absatz. Verwendest du ein import handelt es sich um ein "derivative work" und ich muss das ganze unter die LGPL stellen.

Zugleich steht im zweiten Absatz. Wenn ich das so mache, dann muss ich den Anwendern die Möglichkeit geben die genutzten Libs zu modifizieren und die Anwender dürfen meinen Code (der unter einer anderen Lizenz stehen kann?) "reverse engineer" = dekompilieren?

Wiederspricht sich da nicht der erste und der zweite Absatz?
 

Ebenius

Top Contributor
Du hast das da falsch übersetzt:
So, the copyright holder for the library must authorize distribution of the work. The LGPL permits this distribution.

Da steht: Der Rechteinhaber der Bibliothek [nicht der Applikation] muss die Erlaubnis geben ...

Ebenius
 
G

Guest

Gast
Ok ich glaube wir reden aneinander vorbei.

Wenn ich "import" nutze um auf eine Klasse einer anderen JAR zu verlinken, dann darf ich das gar nicht (zumindest nicht mit der LGPL)?

Zugleich steht aber im zweiten Absatz wenn ich das doch mache, dann kann ich das unter der LGPL tun wenn ...

If you distribute a Java application that imports LGPL libraries, it's easy to comply with the LGPL

Mich stört hier das import. Und wie "importiere" ich dann ein Bibliothek die unter der LGPL steht, wenn ich das nur darf, wenn der Rechteinhaber zustimmen muss?
 
G

Guest

Gast
Das ist jetzt aber ein Wiederspruch in sich oder?

Bevor man über die Frage spricht: Was darf ich unter der Lizenz mit der Bibliothek tun, muss das Werk erstmal eine Lizenz haben. Also hat der Rechteinhaber hat die Bibliothek bereits unter die LGPL gestellt.

Greift nun eine Applikation auf die Bibliothek zu und nutzt die "import"-Funktion dann geht das eben mit der LGPL nicht:

... The LGPL permits this distribution

Also bleibt nichts anderes übrig als ?

a) Alle LGPL-Bibliotheken schreddern ? (Keine Nutzung unter der LGPL ohne zusätzlich Erlaubnis?)

b) Die Bibliothek anders nutzen ?

c) Bei der Verwendung einer LGPL Bibliothek den Nutzer jedes mal um Erlaubnis zu bitten ?

Die Antwort b) scheidet nach meinem dafürhalten aus, da später geschrieben steht:

Inheritance creates derivative works in the same way as traditional linking, and the LGPL permits this type of derivative work in the same way as it permits ordinary function calls.

Also sind auch einfache Funktionsaufrufe auf die Bibliothek unter der LGPL nicht möglich.
 

Ebenius

Top Contributor
Weil ich's jetzt schon übersetzt habe: So nah wie möglich am Original, kein gutes Deutsch und "Reverse Engineering" kann ich nicht übersetzen. Natürlich gibt's keine Garantie auf Vollständigkeit oder inhaltliche Richtigkeit:
Ungefähr auf Deutsch: David Turner hat gesagt.:
Typischer weise werden alle Bibliotheken die eine Java-Anwendung verwendet als JAR (Java-Archiv) verteilt. Die Anwendungen benutzen Java's "import"-Funktionalität um auf Klassen dieser Bibliotheken zuzugreifen. Wenn die Anwendung kompiliert wird, werden die Methodensignaturen gegen die Bibliothek geprüft und verknüpft. Die Anwendung ist damit allgemein eine auf die Bibliothek aufbauende Arbeit. Deshalb muss der Rechteinhaber der Bibliothek der Verteilung dieser Arbeit authorisieren. Die LGPL authorisiert diese Verteilung.

Wenn Sie eine Java-Anwendung verteilen die LGPL-Bibliotheken importieren, ist es einfach die LGPL einzuhalten. Die Lizenz Ihrer Anwendung muss es anderen erlauben, die Bibliothek zu modifizieren und Reverse Engineering Ihres Codes zu betreiben um diese Modifikationen zu testen.

Ebenius
 
G

Gast

Gast
Besten Dank!

Weil wir gerade bei dem Thema sind. Es ist in dem Text ja nichts darüber gesagt wo diese Bibliotheken liegen?

Ich darf also auch eine mit fatJAR / oneJAR erstelltes Archiv nutzen. Die Ordner-Struktur und damit eine Trennung zwischen meinem Code und den Bibliotheken bleibt erhalten. Oder seht ihr das anders?

Wie sieht es dann mit Java Wrappern aus, die aus einem JAR-Archiv eine EXE-Datei machen?
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
Weil wir gerade bei dem Thema sind. Es ist in dem Text ja nichts darüber gesagt wo diese Bibliotheken liegen?

Ich darf also auch eine mit fatJAR / oneJAR erstelltes Archiv nutzen. Die Ordner-Struktur und damit eine Trennung zwischen meinem Code und den Bibliotheken bleibt erhalten. Oder seht ihr das anders?
Du bekommst die Lizenz für eine Bibliothek. Nicht für einzelne Klassen. Ich würde beim Neuzusammenstellen lizenzrechtliche Probleme erwarten.

Anonymous hat gesagt.:
Wie sieht es dann mit Java Wrappern aus, die aus einem JAR-Archiv eine EXE-Datei machen?
An der Stelle bin ich mir halbwegs sicher, dass ein Gericht gegen Dich entscheiden würde.

Disclaimer: Ich drücke nur meine Meinung aus. Niemand sollte das mit einer Rechtsberatung verwechseln. :)

Ebenius
 
G

Guest

Gast
Hallo Ebenius,

bzgl. dem Wrapper habe ich mir das schon gedacht. Das sehe ich ebenso kritisch.

Bzgl. oneJAR / fatJAR habe ich mich falsch ausgedrückt.

Du bekommst die Lizenz für eine Bibliothek. Nicht für einzelne Klassen. Ich würde beim Neuzusammenstellen lizenzrechtliche Probleme erwarten.

oneJAR übernimmt die gesamte Bibliothek (JAR-Datei). Diese wird nicht entpackt oder neu zusammengepackt, sondern wird so wie sie ist in ein JAR Archiv gepackt (quasi JAR in JAR). Drum herum wird ein ClassLoader gebastelt, der das JAR in der JAR lädt. Da hier die Strukturen beibehalten werden halte ich es für unkritisch.

Aber auch das ist nur meine private Meinung!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4
J Problem mit static/non-static Allgemeine Java-Themen 2
G getAppletContext() in static Methode Allgemeine Java-Themen 3
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
J Nicht-static variable in static variable kopieren - wie? Allgemeine Java-Themen 14
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
G static vor einem array Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
A JSP & static-Variablen Allgemeine Java-Themen 3
B Static Import: Syntaxfrage Allgemeine Java-Themen 2
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
Z auf static Methode aus anderen Package zugreifen? Allgemeine Java-Themen 7
N this im public static void Allgemeine Java-Themen 3
C Communication zwischen zwei Projekte - static objects Allgemeine Java-Themen 4
S static mit abstract und in interface Allgemeine Java-Themen 10
N Java Dynamic Proxy Allgemeine Java-Themen 3
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
lumo 2D-Grafik ConvolveOp stativ vs dynamic? Allgemeine Java-Themen 3
P Ant oder Dynamic Web Projekt Allgemeine Java-Themen 3
J dynamic programming Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben