lp_solve mit Java nutzen - Can't find dependent libraries

Skrodde

Aktives Mitglied
Hallo zusammen,
für ein Projekt würde ich gerne javaILP (Java ILP - Java Interface to ILP Solvers) zusammen mit dem ILP Löser lp_solve5.5 (lp_solve reference guide) nutzen. Ich habe mir also javaILP herunter geladen und mit Eclipse als externe JAR eingebunden. Soweit, so gut. Weiterhin habe ich mir ein Verzeichnis lp_solve angelegt und dort die Dateien aus lp_solve_5.5_dev and lp_solve_5.5_exe hinein extrahiert. In das selbe Verzeichnis habe ich nun die Java-Wrapper DLL kopiert. Soweit, so gut. Nun muss ich das alles irgendwie in Eclipse in den CLASSPATH und als native Libraries einbinden (glaube ich).
Ich habe also die Wrapper Datei lpsolve55j.jar als externe JAR bei Eclipse eingebunden. Dann habe ich mit dieser Anleitung für die lpsolve55j.jar den Folder "lp_solve" als library angegeben.
Zuletzt habe ich jetzt den Beispiel-Code von hier in meine Main gepackt und erhalte dabei folgende Fehlermeldung:

Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Dokumente und Einstellungen\mskrodoz\Eigene Dateien\lp_solve\lpsolve55j.dll: Can't find dependent libraries
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(Unknown Source)
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.loadLibrary0(Unknown Source)
	at java.lang.System.loadLibrary(Unknown Source)
	at lpsolve.LpSolve.<clinit>(LpSolve.java:275)
	at net.sf.javailp.SolverLpSolve.solve(SolverLpSolve.java:93)
	at Squared.main(Squared.java:56)

Nun meine Frage: Was habe ich falsch gemacht? Ich dachte, alle Schritte korrekt befolgt zu haben, wie sie hier unter "Using lp_solve 5.5 in Java programs" benannt werden.

Vielen, vielen Dank für die Hilfe,
Gruß, skrodde
 
Keine Ahnung, aber vielleicht stört das Leerzeichen im Pfad (was für eine bescheuerte Idee von M$!). Verschiebe es mal in ein anderes Verzeichnis, oder schreibe "Dokume~1" statt "Dokumente und Einstellungen".
 
Hi Landei,
vielen Dank für den schnellen Vorschlag, allerdings ändert es leider nichts. Ich habe jetzt den Ordner "lp_solve" nach "C:\" verschoben, bekomme nun eine entsprechende Fehlermeldung: 🙁
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\lp_solve\lpsolve55j.dll: Can't find dependent libraries
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(Unknown Source)
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.loadLibrary0(Unknown Source)
	at java.lang.System.loadLibrary(Unknown Source)
	at lpsolve.LpSolve.<clinit>(LpSolve.java:275)
	at net.sf.javailp.SolverLpSolve.solve(SolverLpSolve.java:93)
	at Squared.main(Squared.java:60)
 
Hallo,

"Can't find dependent libraries" bedeutet, dass eine DLL weitere Librarys (DLLs) nachladen will, diese aber nicht findet.
Vermutlich liegen die in diesem Fall auch in C:\lp_solve, also einfach dieses Verzeichnis der PATH-Variablen hinzufügen.
 
Hallo Peter,
vielen Dank für die Antwort. Soweit ich weiß, muss man die PATH-Variable im Windows-Betriebssystem setzen, bei den Laufzeitvariablen, korrekt? Gibt es eine Lösung, mit der ich das rein über Eclipse machen kann? Momentan habe ich den Pfad C:\lp_solve\ als "NativeLibraryLocation" eingetragen, sonst hätte er die lpsolve55j.dll gar nicht gefunden. Müsste er dann nicht auch den Rest aus dem Verzeichnis finden?
Danke nochmals für die Antwort, Skrodde
 
"NativeLibraryLocation" (oder die Property java.library.path) sagt der Java-VM nur, wo die erste DLL (also die, die mit java.lang.System.loadLibrary() geladen werden soll, in dem Fall lpsolve55j.dll) zu finden ist.
Wenn lpsolve55j.dll aber weitere DLLs nachladen will, geschieht das über das Betriebssystem, und da wird u.a. im PATH gesucht.

Den PATH kann man in Eclipse explizit in der Run configuration setzen:
Im Hauptmenü unter "Run -> Run Configurations", auf der Reiterkarte "Environment" eine neue Variable namens "PATH" mit Value "C:\lp_solve" hinzufügen.
 
Hallo Peter,
daran hat es gelegen, jetzt funktioniert alles wunderbar. Dafür gleich mehr als nur ein "Danke" per Knopf :toll:
 
Man kann die entsprechenden Verzeichnisse auch als JVM-Argument beim Start des Programms angeben: -Djava.library.path=...

Aber ich hatte vorausgesetzt, dass das bekannt ist.
 

Neue Themen


Zurück
Oben