# Einbinden von externen Java und C Bibliotheken



## nabla (12. Mrz 2010)

Hi,

ich habe ein Programm mit Eclipse geschrieben, welches mehrere externe Java Bibliotheken (zum Beispiel als jar auf der entsprechenden Projekt-Seite herunterladbar) benoetigt. In Eclipse habe ich diese Bibliotheken angegeben, so dass es laeuft. Erzeuge ich zum Beispiel ein Runnable Jar file klappt alles und ich kann das jar komplett ohne die Bibliotheken oder irgendwelche path Angaben laufen lassen.

Nur wie verteile ich den Code jetzt? So wie ich das verstehe, ist Ant fuer sowas gedacht. Ich habe mal testweise Eclipse ein Ant file erzeugen lassen, das hat aber die Verzeichnisse zu den Bibliotheken hard coded. Was macht man da? Ich denke dabei an sowas wie ein ./configure.

Hinzu kommt noch, dass ich auch noch eine C Bibliothek fuer mein Programm benoetige (das dann aber nur zur runtime), kann man irgendwie testen, ob die vorhanden ist?

Danke fuer Anregungen!


----------



## Wildcard (12. Mrz 2010)

Ant ist nicht zum verteilen von irgendetwas gedacht, sondern zum builden.
Ant ist nur ein mögliches Buildtool, da gibt es auch noch Maven, Buckminster und viele andere.
Welches das richtige für dich ist hängt von deinen Anforderungen ab über die du bisher nicht viel gesagt hast.


----------



## nabla (13. Mrz 2010)

Hi Wildcard,

vielleicht liegt da mein Missverstaendnis, denn ich habe das Gefuehl, ich sehe den Wald vor lauter Baeumen nicht... Damit ist das dann vielleicht auch das falsche Sub-Forum hier?!

Ich moechte einfach sowas wie die autoconf tools nur halt fuer mein Java Programm. Meine Vorstellung der Sache:

Tar Package entpacken
Test, ob alle Abhaengigkeiten erfuellt sind und Zusammenstellen der Pfade dafuer (wie ./configure)
Build, welche vielleicht gleich eine executable erstellt 
	
	
	
	





```
java -Xmx1234m  -classpath There/Are/My/Dependencies -jar my.jar
```
 (wie make)
Nicht mehr, nicht weniger. Alles, was die einzelnen Schritte vereinfacht, ist gut. Wie gesagt, ich arbeite in Eclipse, brauche mehrere externe Java-Bibliotheken, die ich den User von den entsprechenden Seiten herunterladen lassen moechte und brauche auch eine C-Bibliothek.


----------



## Siassei (13. Mrz 2010)

Servus,

ich bin mir nicht sicher, aber möchtest du so etwas wie einen Installer basteln? Ähnliche wie im Linux-Umfeld, also ./configure, make, make install ?

Für derartiges gibt es in der (Java-)Welt viele Tools. Ant ist für derartie Aufgabe eher weniger geeignet, wie mein Vorredner schon sagt. Da in Java auf allen Platformen genau das gleiche .jar erzeugt wird. Das macht ein kompilieren auf der Zielplattform nicht nötig.

Mit Tools, wie z.B. Maven, würde sich so etwas realisieren lassen. Du musst lediglich beachten, dass du alles mitlieferst um den eingebetteten Modus benutzen zu können. Ich persönlich würde dich eher auf Scons oder Gradle verweisen. Für Scons gibt es bereits ein Eclipse-Plugin und ist somit schön zu benutzen. Obwohl die Qualität etwas zu wünschen lässt. Gradle ist noch in der Entwicklung und es werden erst am Ende des Jahres die ersten Plugin's für IDE's erscheinen. Gradle bietet die komplette funktionalität von Groovy und somit von der JRE. Zudem sind auch Repository's in einzelnen Ordner, sowie das Einbinden von einzelnen .jar's,  möglich.
Ich persönlich würde auf Gradle setzen. Für Maven gibt es natürlich auch ein Native-Plugin, das du benutzen kannst.

Ich meine, du solltest mal deine Situation etwas genauer Beschreiben. Vielleicht lösst RPM bzw. DEP dein Problem?

Gruß,
  Thomas


----------



## nabla (13. Mrz 2010)

Hi Siassei,

danke fuer deine ausfuehrlichen Hinweise! Ich werde mal noch ein wenig beschreiben:

Ich habe ein (relativ uebersichtliches) Programm geschrieben, das (nichtsdestotrotz) aus mehrern packages besteht: mypackage.tools, mypackage.conf und mypackage.convert. In letzterem steht die Klasse mit der Main. Der Benutzer soll nun nicht lange in dem src Wust herumsuchen und halt eine (irgendwie) ausfuehrbare Sache praesentiert bekommen.

Dazu werden drei externe Bibliotheken benoetigt (netcdf, citygml4j und proj4). Die beiden ersteren sind als java-Version als jar verfuegbar und ich moechte, dass der Anwender sie herunterlaed, sie sollen nicht in mein (wie auch immer das dann aussieht) repository. proj4 gibt es komplett nur als C-Bibliothek. Die muss mit den richtigen Befehlen kompiliert sein und installiert sein. Die entsprechenden Java-Classen zum einbinden der C-Bibliothek habe ich in meinen Code.

Im System des Benutzers muss das Programm nicht direkt installiert werden, da es sehr speziellen Nutzen hat und auch nicht sehr oft ausgefuehrt werden muss. Ok, ich koennte also ein fertiges jar erzeugen. Nur wie ist das dann mit den Abhaengigkeiten? Die sollen da ja nicht mit rein. Wenn die aber nun geupdated werden (ich gehe mal davon aus, dass die Klassenstruktur etc. erhalten bleibt), laeuft es dann trotzdem? Ich kenne halt nur Probleme, wenn man mal eine C-Bibliothek updated, dass dann oft Programme, die dagegen dynamisch linken, nicht mehr funktionieren. Die einfach neu kompilieren, hilft. Gibt's sowas bei Java auch?

Ausserdem will ich halt auch den Quellcode zur Verfuegung stellen. Hier soll auch einer, der nicht viel Ahnung von Java hat, einfach mal den Emacs anfeuern koennen und zwei Zeilen reinhacken koennen. Beim Kompilieren sollte dann nach den externen Bibliotheken gefragt werden. Ehrlich gesagt, habe ich auch keine Ahnung, wie man die ganzen Klassen per Hand in der Konsole kompilieren wuerde, macht ja das eclipse alles....

Vermutlich sind die ganzen Tools overkill... So scheint es mir, eigentlich alles ganz klein...


----------



## Siassei (14. Mrz 2010)

Servus,

zum Compilieren und Linken:
In Java musst du dir keine Sorgen machen. Das Laden, Linken, und Co. macht alles die JVM zur Laufzeit. Du musst lediglich beachten, dass du beim start angibst, wo der Classloader die Bibliotheken (.jar, .class, .so, .dll, ...) findet.

Quellcode und ausführbares Programm sollte man generell trennen bzw. getrennt anbieten. Mir scheint so, als handelt es sich hier um ein Schulungsprojekt (Schule oder Hochschule).
Bei allen Build-Tools kannst du den Ausgabe-Ordner angeben. Diesen kannst du z.B. bin oder lib taufen. Am einfachsten wird es, wenn du zwei Skripte (Shell, .sh oder .bat) beilegst und hier die nötigen Befehle zum kompilieren und zum starten des Programmes hinterlegst.
Build-Tools wie Maven und Gradle laden die Abhängigkeiten automatisch vom entfernten Server, sofern diese im Repository der öffentlichen Server vorhanden sind. Ist dies nicht der Fall, musst du die in deinem Archive mitliefern.
Scons besitzt diese Fähigkeit nicht.

Was ist auf den Ziel-Rechner installiert? Nur Emacs und sonst nichts? Beachte, dass du ein JDK für Java benötigst und einen C, Fortran, C++ oder ??? Compiler für die restlichen Projekte.


----------

