Jak dodać bibliotekę natywną do „java.library.path” przy uruchomieniu Eclipse (zamiast nadpisywać)

92

Mam natywną bibliotekę, którą należy dodać do java.library.path . Z argumentem JVM -Djava.library.path = ścieżka ... mogę ustawić ścieżkę tak, jak chcę.

Mój problem polega na tym, że moja inna biblioteka (raportowanie Pentaho) przeszukuje czcionki w oparciu o domyślną ścieżkę java.library.path (w tym katalogi systemowe itp.), A ustawienie ręczne zastępuje domyślną ścieżkę.

Więc: jak mogę dodać wpis ścieżki do domyślnego java.library.path zamiast go zastępować (co wydaje się być zrobione za pomocą -Djava.library.path)? (Nie chciałbym ręcznie dodawać domyślnej ścieżki, co nie byłoby przyjemne ze względu na wdrożenie)

EDYCJA: Przepraszamy za brakujące szczegóły; Pracuję z Eclipse. (Wdrożenie odbywa się za pomocą JNLP i tam mogę użyć nativelib w zasobach )

Touko
źródło
1
proszę zobaczyć zamiast tego zaakceptowaną odpowiedź na to pytanie - dla mnie jest dużo lepiej: stackoverflow.com/questions/957700/ ...
laher
Pytanie „jak dodać natywną bibliotekę do ..” jest niejasne. Chodzi prawdopodobnie o dodanie (dołączenie lub dodanie) kolejnej „ścieżki biblioteki”, czyli zakładając, że Eclipse wyświetla coś takiego jak java.library.path = ścieżka1: ścieżka2: ścieżka3 domyślnie, pytanie brzmi jak uruchomić Eclipse kończąc w java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

Odpowiedzi:

46

Zapomniałem o tym problemie ... Właściwie pytałem z Eclipse, przepraszam, że nie powiedziałem tego pierwotnie. A odpowiedź wydaje się zbyt prosta (przynajmniej przy 3.5; prawdopodobnie także przy starszych wersjach):

Argumenty konfiguracji uruchomienia Java: argumenty maszyny wirtualnej:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

Nie wolno zapomnieć o cudzysłowach, w przeciwnym razie występują problemy ze spacjami w PATH.

Touko
źródło
7
Jeśli istnieją dwie biblioteki współdzielone, jedna zależna od drugiej, to nie zadziała. Pierwsza jest znajdowana przez środowisko wykonawcze Java, ale druga jest rozpoznawana przez dynamiczny moduł ładujący systemu. Jedynym rozwiązaniem, które znalazłem, jest ustawienie LD_LIBRARY_PATH.
kevin cline
4
Odpowiedź udzielona przez @Touko nie pasuje do pierwotnego pytania, które dotyczy dołączania lub poprzedzania folderu biblioteki natywnej. Przynajmniej w systemie Mac OS 10.8 ani $ PATH, ani $ LD_LIBRARY_PATH, ani $ {workspace_loc: project} \ lib nie mają nic wspólnego z wartością domyślną. Na przykład na moim Macu domyślną wartością jest $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger
Jeśli używasz TestNG w Eclipse, będziesz musiał edytować konfigurację uruchomienia TestNG: - W oknie Uruchom konfiguracje wybierz docelową konfigurację TestNG. - Wybierz kartę Środowisko - Dodaj zmienną PATH i ustaw jej wartość jako docelową - Pozostaw domyślny przełącznik „Dołącz środowisko do środowiska natywnego”.
Philippe,
Czy mogę dostać przykład.
basickarl
@kevincline, czy możesz wyjaśnić, dlaczego dokładnie to nie zadziała w takim przypadku? Właśnie napotkałem ten problem i próbuję zrozumieć, co jest nie tak w tym rozwiązaniu.
anula
14

Jeśli chcesz dodać natywną bibliotekę bez ingerencji java.library.pathw środowisko Eclipse podczas programowania (aby uniknąć uwzględniania ścieżek bezwzględnych i konieczności dodawania parametrów do konfiguracji uruchamiania), możesz podać ścieżkę do lokalizacji bibliotek natywnych dla każdego Jar w kompilacji Java ścieżki dialogowe pod Native lokalizacji biblioteki . Należy zauważyć, że nazwa pliku biblioteki natywnej musi odpowiadać nazwie pliku Jar. Zobacz także ten szczegółowy opis .

Fabian Steeg
źródło
3
-1. Zakładasz, że użytkownik końcowy uruchamia aplikację ze środowiska IDE, co jest mało prawdopodobne.
finnw
@finnw, rozumiem twój punkt widzenia. Znalazłem pytanie, szukając rozwiązania, jak dodać natywną bibliotekę w IDE podczas programowania, bez nadpisywania java.library.pathi wróciłem po znalezieniu rozwiązania w innym miejscu. Zmienię moją odpowiedź, aby była jaśniejsza.
Fabian Steeg
Właściwie pracuję z Eclipse, mimo że nie wspomniałem o tym w pytaniu.
Touko
To faktycznie nie działa w aktualnej wersji Eclipse (Luna), ponieważ ustawienie tej właściwości nadpisuje java.library.path tak, jak użytkownik opisuje jako problem w pytaniu.
Alex N.
9

SWT umieszcza niezbędne natywne biblioteki DLL w pliku JAR. Wyszukaj przykład „org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar”.

Biblioteki DLL muszą znajdować się w katalogu głównym pliku JAR, plik JAR musi być podpisany, a biblioteka DLL musi znajdować się z sumą kontrolną w pliku META-INF / MANIFEST.MF, aby maszyna wirtualna mogła je pobrać.

Aaron Digulla
źródło
2
Jak mogę to zrobić z NetBeans?
Maciek Sawicki
AFAIK, NetBeans używa Ant do budowania projektu. Przeczytaj dokumentację Ant, jak tworzyć podpisane pliki JAR i jak umieszczać elementy takie jak biblioteki DLL w manifeście.
Aaron Digulla
Jak ustawić dodawanie .dll w Eclipse?
NoBugs
@NoBugs: W Eclipse ten post powinien pomóc: eclipsezone.com/eclipse/forums/t49342.html
Aaron
@AaronDigulla Czy sugerujesz, że DLL może być zawsze dołączony w ten sposób? Myślałem, że wyszukuje tylko coś takiego java.library.path. Czy sugerujesz, że szuka tylko korzenia jar?
4

W systemie Windows na przykład:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% to Twoja stara ścieżka -Djava.library

andy boot
źródło
Wypróbowałem ten pomysł, ale powstał jako java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko,
Możesz także użyć $ {system_property: java.library.path}
Rob Elsner,
2
Wartość domyślna w systemie UNIX / Mac / GNU Linux to LD_LIBRARY_PATH. PATH to kwestia systemu Windows.
whaefelinger
2

Czy można to obejść, wywołując programowo System.load () w celu załadowania biblioteki natywnej? Ta metoda (w przeciwieństwie do System.loadLibrary () ) umożliwia określenie ścieżki bezwzględnej.

Simon Nickerson
źródło
1
Proszę wyjaśnić, jak wywołać System.load () programowo podczas uruchamiania Eclipse?
whaefelinger
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 stwierdza, że ​​nie ma mechaniki zastępowania zaimplementowanej w programie uruchamiającym Eclipse, a przynajmniej nie do wydania Juno.

Dlatego podczas uruchamiania Eclipse bez wcześniejszej wiedzy o ustawieniach domyślnych dodanie lub dodanie innego folderu biblioteki do java.library.path jest (prawie) niemożliwe.

Napisałem prawie, bo powinno dać się uruchomić Eclipse, zrzucić zawartość java.library.path i zatrzymać Eclipse jednym poleceniem. Zrzut zostałby przeanalizowany, a następnie przyjęty jako dane wejściowe do uruchomienia Eclipse, tj

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"
Whaefelinger
źródło
1

W systemach UNIX można dołączyć do zmiennej środowiskowej LD_LIBRARY_PATH. W systemie Windows maszyna JVM automatycznie ustawia właściwość systemową java.library.path na PATH; więc jeśli dll znajduje się na Twojej PATH, gotowe.

geowa4
źródło
Starter wątku był bardzo szczegółowy, jeśli chodzi o „dołączanie” drugiego folderu biblioteki natywnej, nie zgadzasz się?
whaefelinger
@ user667073 Mówiłem to samo ... DODAWANIE jest pytanie, osoba rozpoczynająca wątek już wie, jak załadować udostępnioną bibliotekę ;-)
Ustaman Sangat
STS 3.4.0 i Mac OS 10.8: Ustawienia LD_LIBRARY_PATH nie mają żadnego wpływu na java.library.path. Przetestowałem to z Subclipse / JavaHL. Ten działał: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib podczas eksportu LD_LIBRARY_PATH = / opt / local / lib; STS był ujemny.
whaefelinger
1

Okno-> Preferencje-> Java-> Zainstalowane środowiska JRE. Następnie wybierz bieżące środowisko JRE (JDK) i kliknij Edytuj. Wypełnij domyślne argumenty maszyny wirtualnej: -Djava.library.path = / usr / local / xuggler / lib. Gotowe!

Vadym
źródło
1
Ta odpowiedź jest bezużyteczna, ponieważ starter wątku pyta konkretnie o „Jak dodać bibliotekę natywną [..] zamiast nadpisywać [..]”. Ta odpowiedź po prostu zastępuje ustawienie domyślne.
whaefelinger
1

Rozwiązanie zaproponowane przez Roba Elsnera w jednym z powyższych komentarzy działa doskonale (OSX 10.9, Eclipse Kepler). Należy dołączyć ich dodatkowe ścieżki do ścieżek oddzielonych znakiem „:”.

Możesz też użyć $ {system_property: java.library.path} - Rob Elsner, 22 listopada 2010 o 23:01

Johan
źródło
0

Nazwa pliku biblioteki natywnej musi odpowiadać nazwie pliku Jar. To jest bardzo ważne. Upewnij się, że nazwa jar i nazwa dll są takie same. Zobacz także post od Fabiana Steega. Mój plik do pobrania dla jawin zawierał różne nazwy dll i jar. Było to jawin.jar i jawin d .dll, zwróć uwagę na dodatkowe „d” w nazwie pliku dll. Po prostu zmieniłem jego nazwę na jawin.dll i ustawiłem jako natywną bibliotekę w zaćmieniu, jak wspomniano w poście „ http://www.eclipsezone.com/eclipse/forums/t49342.html

Dhana
źródło
Pytanie dotyczy dodania natywnej biblioteki (folderu) podczas uruchamiania Eclipse.
whaefelinger
0

Z jakiegoś powodu nie mogłem uruchomić wielu folderów (dobrze to działało przez jakiś czas, ale gdy tylko potrzebowałem więcej bibliotek dll i dodałem więcej folderów, żaden z białymi spacjami w ścieżce). Następnie skopiowałem wszystkie potrzebne biblioteki DLL do jednego folderu i miałem to jako moją java.library.path i zadziałało. Nie mam wytłumaczenia - gdyby ktoś to zrobił, byłoby świetnie.

Ustaman Sangat
źródło
Cóż, jeśli natywna biblioteka zostanie znaleziona za pośrednictwem java.library.path i skopiujesz inną do tego folderu, to wydaje się naturalne, że druga również została znaleziona, prawda?
whaefelinger
Oczywiście, dlatego właśnie tego użyłem, duh! Zastanawiałem się, czy można dodać do niego wiele folderów bez konieczności przenoszenia lub łączenia elementów.
Ustaman Sangat
0

Wiele z istniejących odpowiedzi zakłada, że ​​chcesz ustawić to dla konkretnego projektu, ale musiałem ustawić to dla samego Eclipse , aby obsługiwać zintegrowane uwierzytelnianie dla sterownika SQL Server JDBC.

Aby to zrobić, postępowałem zgodnie z tymi instrukcjami, aby uruchomić Eclipse z wiersza poleceń Java zamiast z jego normalnego programu uruchamiającego. Następnie zmodyfikowałem ten skrypt, aby dodać mój argument -Djava.library.path do wiersza poleceń Java.

CrazyPyro
źródło
0
  1. W systemie Windows: dodaj ścieżkę do biblioteki do zmiennej środowiskowej PATH.
  2. W systemie Linux: dodaj ścieżkę do biblioteki do zmiennej środowiskowej LD_LIBRARY_PATH.
  3. Na komputerze Mac: dodaj ścieżkę do biblioteki do zmiennej środowiskowej DYLD_LIBRARY_PATH.

java.library.path jest inicjowany z wartościami powyższych zmiennych na odpowiedniej platformie.

To powinno działać na każdym IDE.

Możesz sprawdzić, czy wartość jest taka, jakiej oczekujesz, dzwoniąc java -XshowSettings:properties

rboc
źródło
-2

W systemie Windows stwierdziłem, że ważne jest, aby uruchomić Eclipse z wiersza poleceń, a nie z menu Start lub skrótu, pod warunkiem, że natywna biblioteka DLL znajduje się w katalogu w Twojej ścieżce. Najwyraźniej zapewnia to, że właściwy katalog znajduje się na ścieżce.

Alan
źródło
Popraw mnie, jeśli się mylę, ale uważam, że bieżący katalog roboczy w systemie Windows jest automatycznie uwzględniany podczas wyszukiwania bibliotek DLL (lub wykonywalnych plików binarnych). Dlatego po przejściu do folderu, w którym znajdują się biblioteki DLL i uruchomieniu, a następnie uruchomieniu Eclipse, wtedy tak, pliki DLL, których szukasz, zostaną znalezione. Poza tym, jak ta odpowiedź jest powiązana z pytaniem o rozpoczynających wątki?
whaefelinger