Come aggiungere una libreria nativa a "java.library.path" con il lancio di Eclipse (invece di sovrascriverla)


90

Ho una libreria nativa che deve essere aggiunta a java.library.path . Con l'argomento JVM -Djava.library.path = path ... posso impostare il percorso come voglio.

Il mio problema è che la mia altra libreria (pentaho reporting) cerca i font in base al java.library.path predefinito (comprese le directory di sistema, ecc.) E l'impostazione manuale sovrascrive il percorso predefinito ..

Quindi: come posso aggiungere una voce di percorso al java.library.path predefinito invece di sovrascriverlo (che sembra essere fatto con -Djava.library.path)? (Non vorrei aggiungere manualmente il percorso predefinito, il che non sarebbe bello per motivi di distribuzione)

EDIT: Ci scusiamo per i dettagli mancanti; Sto lavorando con Eclipse. (La distribuzione viene eseguita con JNLP e lì posso usare nativelib sotto le risorse )


1
per favore vedi la risposta accettata per questa domanda invece - per me è molto meglio: stackoverflow.com/questions/957700/…
laher

La domanda "come aggiungere una libreria nativa a .." è fonte di confusione. Probabilmente si tratta di aggiungere (aggiungere o anteporre) un altro "percorso libreria", cioè supponendo che Eclipse mostri qualcosa come java.library.path = path1: path2: path3 per impostazione predefinita, la domanda è come avviare Eclipse finendo in java.library .path = my / lib / folder: path1: path2:
path3

Risposte:


46

Avevo dimenticato questo problema ... in realtà stavo chiedendo con Eclipse, mi dispiace per non averlo affermato originariamente. E la risposta sembra essere troppo semplice (almeno con 3.5; probabilmente anche con versioni precedenti):

Argomenti della configurazione di esecuzione Java: Argomenti VM:

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

Non bisogna dimenticare le virgolette, altrimenti ci sono problemi con gli spazi in PATH.


7
Se sono presenti due librerie condivise, una dipendente dall'altra, ciò non funzionerà. Il primo viene trovato dal runtime Java, ma il secondo viene risolto dal caricatore dinamico del sistema. L'unica soluzione che ho trovato è impostare LD_LIBRARY_PATH.
kevin cline

4
La risposta data da @Touko non si adatta alla domanda originale che riguarda l'aggiunta o l'aggiunta di una cartella della libreria nativa. Almeno su Mac OS 10.8, né $ PATH né $ LD_LIBRARY_PATH né $ {workspace_loc: project} \ lib hanno qualcosa a che fare con il valore predefinito. Ad esempio, sul mio Mac il valore predefinito è $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger

Se stai usando TestNG in Eclipse, dovrai modificare la configurazione di esecuzione di TestNG: - Nella finestra Run Configurations, seleziona la configurazione TestNG di destinazione. - Seleziona la scheda Ambiente - Aggiungi una variabile PATH e imposta il suo valore sulla tua destinazione - Lascia l'opzione predefinita "Aggiungi ambiente all'ambiente nativo".
Philippe

Posso avere un esempio.
basickarl

@kevincline ti dispiacerebbe spiegare perché esattamente non funzionerà in quel caso? Mi sono appena imbattuto in quel problema e sto cercando di capire cosa c'è di sbagliato in questa soluzione.
anula

14

Se desideri aggiungere una libreria nativa senza interferire con la fase java.library.pathdi sviluppo in Eclipse (per evitare di includere percorsi assoluti e dover aggiungere parametri alla configurazione di avvio), puoi fornire il percorso alla posizione delle librerie native per ogni Jar nella build Java Finestra di dialogo Percorso in Posizione libreria nativa . Notare che il nome del file della libreria nativa deve corrispondere al nome del file Jar. Vedi anche questa descrizione dettagliata .


3
-1. Stai assumendo che l'utente finale stia eseguendo l'applicazione da un IDE, il che è improbabile.
finnw

@finnw Capisco il tuo punto. Ho trovato la domanda cercando una soluzione su come aggiungere una libreria nativa nell'IDE durante lo sviluppo, senza sovrascrivere java.library.pathe sono tornato dopo aver trovato la soluzione altrove. Modificherò la mia risposta per renderlo più chiaro.
Fabian Steeg

In realtà sto lavorando con Eclipse anche se non ne ho parlato alla domanda.
Touko,

Questo in realtà non funziona nella versione corrente di Eclipse (Luna) perché l'impostazione della proprietà sovrascrive java.library.path come l'utente descrive come un problema nella domanda.
Alex N.

9

SWT inserisce le DLL native necessarie in un JAR. Cerca "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" per un esempio.

Le DLL devono trovarsi nella radice del JAR, il JAR deve essere firmato e la DLL deve apparire con checksum in META-INF / MANIFEST.MF affinché la VM possa prelevarle.


2
Come posso farlo con NetBeans?
Maciek Sawicki

AFAIK, NetBeans utilizza Ant per costruire il progetto. Leggi la documentazione per Ant su come creare JAR firmati e come inserire cose come le DLL nel manifest.
Aaron Digulla

Come lo imposto per aggiungere il .dll, in Eclipse?
NoBugs

@NoBugs: In Eclipse, questo post dovrebbe aiutare: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla

@AaronDigulla suggerisci che la DLL possa essere sempre allegata in questo modo? Ho pensato che cerca solo qualcosa di simile java.library.path. Suggerite di cercare solo la radice di jar?

4

In Windows, in questo modo:

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

% PATH% è il tuo vecchio -Djava.library.path


Ho provato questa idea ma è risultata java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko

Puoi anche usare $ {system_property: java.library.path}
Rob Elsner

2
L'impostazione predefinita su UNIX / Mac / GNU Linux è LD_LIBRARY_PATH. PATH è una cosa di Windows.
whaefelinger


2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 afferma che non ci sono meccanismi di sostituzione implementati nel launcher di Eclipse, almeno non fino al rilascio di Juno.

Quindi è (quasi) impossibile aggiungere o anteporre un'altra cartella della libreria a java.library.path quando si avvia Eclipse senza conoscere in anticipo l'impostazione predefinita.

Ho scritto quasi, perché dovrebbe essere possibile consentire l'avvio di Eclipse, scaricare il contenuto di java.library.path e interrompere Eclipse con un comando. Il dump verrebbe analizzato e quindi preso come input per l'avvio di Eclipse, ad es

#!/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}"

1

Nei sistemi UNIX, è possibile aggiungere alla variabile d'ambiente LD_LIBRARY_PATH. Su Windows, la JVM imposta automaticamente la proprietà di sistema, java.library.path, su PATH; quindi se la dll è sul tuo PERCORSO, allora sei a posto.


Il thread starter era molto specifico su come "aggiungere" una seconda cartella della libreria nativa, non sei d'accordo?
whaefelinger

@ user667073 Ho detto la stessa cosa ... APPENDING è la domanda, il thread-starter sa già come caricare una
libreria

STS 3.4.0 e Mac OS 10.8: le impostazioni di LD_LIBRARY_PATH non hanno alcun impatto su java.library.path. L'ho testato con Subclipse / JavaHL. Questo ha funzionato: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib durante l'esportazione LD_LIBRARY_PATH = / opt / local / lib; STS era negativo.
whaefelinger

1

Finestra-> Preferenze-> Java-> JRE installati. Quindi scegli il tuo JRE (JDK) corrente e fai clic su Modifica. Riempi gli argomenti predefiniti della VM: -Djava.library.path = / usr / local / xuggler / lib. Fatto!


1
Questa risposta è inutile perché il thread starter chiede specificamente "Come aggiungere una libreria nativa [..] invece di sovrascrivere [..]". Questa risposta sostituisce semplicemente l'impostazione predefinita.
whaefelinger

1

La soluzione offerta da Rob Elsner in uno dei commenti sopra funziona perfettamente (OSX 10.9, Eclipse Kepler). È necessario aggiungere i loro percorsi aggiuntivi a quello separato da ":".

Puoi anche usare $ {system_property: java.library.path} - Rob Elsner 22 novembre 10 alle 23:01


0

Il nome del file della libreria nativa deve corrispondere al nome del file Jar. Questo è molto, molto importante. Assicurati che il nome del jar e il nome della dll siano gli stessi. Inoltre, guarda il post di Fabian Steeg Il mio download per jawin conteneva nomi diversi per dll e jar. Era jawin.jar e jawin d .dll, nota "d" extra nel nome del file dll. L'ho semplicemente rinominato in jawin.dll e l'ho impostato come libreria nativa in eclipse come menzionato nel post " http://www.eclipsezone.com/eclipse/forums/t49342.html "


La domanda riguarda l'aggiunta di una libreria (cartella) nativa all'avvio di Eclipse.
whaefelinger

0

Per qualche motivo non sono riuscito a far funzionare più cartelle (beh per un po ', ma non appena ho avuto bisogno di più dll e ho aggiunto più cartelle, nessuna con spazi bianchi nel percorso). Ho quindi copiato tutte le DLL necessarie in una cartella e l'ho avuta come java.library.path e ha funzionato. Non ho una spiegazione - se qualcuno lo facesse, sarebbe fantastico.


Bene, se una libreria nativa viene trovata tramite java.library.path e ne copi un'altra in quella cartella, allora sembra naturale che venga trovata anche la seconda, no?
whaefelinger

Certo, è per questo che l'ho usato, duh! Quello che mi chiedevo era se si potevano aggiungere più cartelle senza dover spostare o creare collegamenti simbolici.
Ustaman Sangat

0

Molte delle risposte esistenti presumono che tu voglia impostarlo per un particolare progetto, ma dovevo impostarlo per Eclipse stesso al fine di supportare l'autenticazione integrata per il driver JDBC di SQL Server.

Per fare ciò, ho seguito queste istruzioni per avviare Eclipse dalla riga di comando Java anziché dal suo normale programma di avvio. Quindi ho modificato lo script per aggiungere il mio argomento -Djava.library.path alla riga di comando Java.


0
  1. Su Windows: aggiungi il percorso della libreria alla variabile d'ambiente PATH.
  2. Su Linux: aggiungere il percorso alla libreria alla variabile d'ambiente LD_LIBRARY_PATH.
  3. Su Mac: aggiungi il percorso alla libreria alla variabile d'ambiente DYLD_LIBRARY_PATH.

java.library.path viene avviato con i valori delle variabili di cui sopra sulla piattaforma corrispondente.

Questo dovrebbe funzionare su qualsiasi IDE.

Puoi verificare se il valore è quello che ti aspetti chiamando java -XshowSettings:properties


-2

Su Windows, ho scoperto che la cosa importante è avviare Eclipse dalla riga di comando piuttosto che dal menu Start o da un collegamento, a condizione che la DLL nativa si trovi in ​​una directory nel tuo PERCORSO. Apparentemente, questo assicura che la directory corretta sia sul percorso.


Correggimi se sbaglio ma credo che la directory di lavoro corrente su Windows sia automaticamente inclusa durante la ricerca di DLL (o file eseguibili). Pertanto, quando si passa alla cartella in cui si trovano le DLL e si avvia Eclipse, allora sì, le DLL che si stanno cercando vengono trovate. A parte questo, in che modo questa risposta è correlata alla domanda di avvio del thread?
whaefelinger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.