Como adicionar biblioteca nativa a “java.library.path” com o lançamento do Eclipse (em vez de substituí-lo)

90

Eu tenho uma biblioteca nativa que precisa ser adicionada a java.library.path . Com o argumento JVM -Djava.library.path = path ... posso definir o caminho conforme desejo.

Meu problema é que minha outra biblioteca (pentaho reporting) busca fontes com base no java.library.path padrão (incluindo diretórios de sistema, etc.) e a configuração manual substitui o caminho padrão.

Então: como posso adicionar uma entrada de caminho ao java.library.path padrão em vez de substituí-lo (o que parece ser feito com -Djava.library.path)? (Eu não gostaria de adicionar o caminho padrão manualmente, o que não seria bom para fins de implantação)

EDIT: Desculpe pela falta de detalhes; Estou trabalhando com o Eclipse. (A implantação é feita com JNLP e aí posso usar o nativelib nos recursos )

Touko
fonte
1
por favor, veja a resposta aceita para esta pergunta - para mim é muito melhor: stackoverflow.com/questions/957700/…
laher
A questão "como adicionar uma biblioteca nativa a .." é confusa. Provavelmente, trata-se de adicionar (anexar ou preceder) outro "caminho de biblioteca", ou seja, supondo que o Eclipse mostre algo como java.library.path = path1: path2: path3 por padrão, a questão é como iniciar o Eclipse terminando em java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

Respostas:

46

Tinha esquecido esse problema ... Na verdade, eu estava perguntando com Eclipse, desculpe por não ter declarado isso originalmente. E a resposta parece ser muito simples (pelo menos com 3.5; provavelmente com versões mais antigas também):

Argumentos da configuração de execução Java: Argumentos da VM:

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

Não se deve esquecer as aspas, caso contrário, haverá problemas com espaços no PATH.

Touko
fonte
7
Se houver duas bibliotecas compartilhadas, uma dependente da outra, isso não funcionará. O primeiro é encontrado pelo Java runtime, mas o segundo é resolvido pelo carregador dinâmico do sistema. A única solução que encontrei é definir LD_LIBRARY_PATH.
kevin cline
4
A resposta dada por @Touko não se encaixa na pergunta original que é sobre anexar ou adicionar uma pasta de biblioteca nativa. Pelo menos no Mac OS 10.8, nem $ PATH, nem $ LD_LIBRARY_PATH nem $ {workspace_loc: project} \ lib tem algo a ver com o valor padrão. Por exemplo, no meu Mac, o valor padrão é $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :
Whaefelinger de
Se estiver usando o TestNG no Eclipse, você precisará editar a configuração de execução do TestNG: - Na janela Configurações de execução, selecione a configuração de destino do TestNG. - Selecione a guia Ambiente - Adicione uma variável PATH e defina seu valor para o seu destino - Deixe a alternância padrão "Anexar ambiente ao ambiente nativo".
Philippe
Posso obter um exemplo.
basickarl
@kevincline, você se importaria de explicar por que exatamente não funcionará nesse caso? Acabei de encontrar esse problema e estou tentando entender o que há de errado com essa solução.
anula de
14

Se você deseja adicionar uma biblioteca nativa sem interferir java.library.pathno tempo de desenvolvimento no Eclipse (para evitar incluir caminhos absolutos e ter que adicionar parâmetros à configuração de ativação), você pode fornecer o caminho para o local das bibliotecas nativas para cada Jar no Java Build Caixa de diálogo de caminho em localização da biblioteca nativa . Observe que o nome do arquivo da biblioteca nativa deve corresponder ao nome do arquivo Jar. Veja também esta descrição detalhada .

Fabian Steeg
fonte
3
-1. Você está assumindo que o usuário final está executando o aplicativo a partir de um IDE, o que é improvável.
finnw
@finnw eu entendo seu ponto. Eu encontrei a questão procurando por uma solução sobre como adicionar uma biblioteca nativa no IDE durante o desenvolvimento, sem substituir java.library.pathe voltei depois de encontrar a solução em outro lugar. Editarei minha resposta para tornar isso mais claro.
Fabian Steeg
Na verdade, estou trabalhando com Eclipse, embora não tenha mencionado isso na pergunta.
Touko
Na verdade, isso não funciona na versão atual do Eclipse (Luna) porque a configuração da propriedade substitui java.library.path como o usuário descreve como sendo um problema na questão.
Alex N.
9

O SWT coloca as DLLs nativas necessárias em um JAR. Procure por "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" para obter um exemplo.

As DLLs devem estar na raiz do JAR, o JAR deve ser assinado e a DLL deve aparecer com checksum no META-INF / MANIFEST.MF para que a VM as busque.

Aaron Digulla
fonte
2
Como posso fazer isso com o NetBeans?
Maciek Sawicki
AFAIK, o NetBeans usa Ant para construir o projeto. Leia a documentação do Ant sobre como criar JARs assinados e como colocar coisas como DLLs no manifesto.
Aaron Digulla
Como faço para configurá-lo para adicionar o .dll, no Eclipse?
NoBugs de
@NoBugs: No Eclipse, esta postagem deve ajudar: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla
@AaronDigulla, você sugere que o DLL pode ser sempre anexado dessa forma? Eu pensei que ele só procura algo parecido java.library.path. Você sugere que só busque a raiz de jar?
4

No Windows, assim:

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

% PATH% é o seu antigo -Djava.library.path

andy boot
fonte
Tentei essa ideia, mas resultou como java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
Você também pode usar $ {system_property: java.library.path}
Rob Elsner
2
O padrão no UNIX / Mac / GNU Linux é LD_LIBRARY_PATH. PATH é uma coisa do Windows.
Whaefelinger
2

Você pode contornar isso chamando System.load () programaticamente para carregar sua biblioteca nativa? Este método (ao contrário de System.loadLibrary () ) permite que você especifique um caminho absoluto.

Simon Nickerson
fonte
1
Explique como você chamaria System.load () programaticamente ao iniciar o Eclipse.
Whaefelinger de
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 afirma que não há nenhuma mecânica de substituição implementada no iniciador do Eclipse, pelo menos não até o lançamento do Juno.

Portanto, é (quase) impossível anexar ou anexar outra pasta de biblioteca a java.library.path ao iniciar o Eclipse sem conhecimento prévio da configuração padrão.

Eu escrevi quase, porque deve ser possível deixar o Eclipse inicializar, despejar o conteúdo de java.library.path e parar o Eclipse em um comando. O dump seria analisado e, em seguida, considerado como entrada para iniciar o Eclipse, ou seja,

#!/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
fonte
1

Em sistemas UNIX, você pode anexar à variável de ambiente LD_LIBRARY_PATH. No Windows, a JVM configura automaticamente a propriedade do sistema, java.library.path, para PATH; portanto, se a dll estiver em seu PATH, você está pronto.

geowa4
fonte
O iniciador do tópico foi muito específico sobre como "anexar" uma segunda pasta de biblioteca nativa, você não concorda?
Whaefelinger
@ user667073 Tenho dito o mesmo ... APENDENDO é a questão, o thread-starter já sabe como carregar uma biblioteca compartilhada ;-)
Ustaman Sangat
STS 3.4.0 e Mac OS 10.8: As configurações de LD_LIBRARY_PATH não têm nenhum impacto em java.library.path. Eu testei isso com Subclipse / JavaHL. Este funcionou: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib enquanto exporta LD_LIBRARY_PATH = / opt / local / lib; STS teve negativo.
Whaefelinger de
1

Janela-> Preferências-> Java-> JREs instalados. Em seguida, escolha seu JRE (JDK) atual e clique em Editar. Preencha os argumentos padrão da VM: -Djava.library.path = / usr / local / xuggler / lib. Feito!

Vadym
fonte
1
Esta resposta é inútil porque o iniciador do thread pergunta especificamente sobre "Como adicionar uma biblioteca nativa [..] em vez de substituir [..]". Esta resposta apenas substitui a configuração padrão.
Whaefelinger de
1

A solução oferecida por Rob Elsner em um dos comentários acima funciona perfeitamente (OSX 10.9, Eclipse Kepler). É necessário anexar seus caminhos adicionais àqueles separados por ":".

Você também pode usar $ {system_property: java.library.path} - Rob Elsner, 22 de novembro de 2010 às 23:01

João
fonte
0

O nome do arquivo da biblioteca nativa deve corresponder ao nome do arquivo Jar. Isto é muito, muito importante. Certifique-se de que o nome do jar e o nome da dll são iguais. Além disso, consulte a postagem de Fabian Steeg Meu download para jawin continha nomes diferentes para dll e jar. Era jawin.jar e jawin d .dll, observe o 'd' extra no nome do arquivo dll. Eu simplesmente o renomeei para jawin.dll e o defini como uma biblioteca nativa no eclipse, conforme mencionado na postagem " http://www.eclipsezone.com/eclipse/forums/t49342.html "

Dhana
fonte
A questão é sobre como adicionar uma biblioteca nativa (pasta) ao iniciar o Eclipse.
Whaefelinger de
0

Por algum motivo, não consegui fazer com que várias pastas funcionassem (bem funcionou por um tempo, mas assim que precisei de mais dlls e adicionei mais pastas, nenhuma com espaços em branco no caminho). Em seguida, copiei todas as dlls necessárias para uma pasta e tive isso como meu java.library.path e funcionou. Não tenho uma explicação - se alguém tiver, seria ótimo.

Ustaman Sangat
fonte
Bem, se uma biblioteca nativa for encontrada via java.library.path e você copiar outra para essa pasta, então parece natural que a segunda também seja encontrada, não é?
Whaefelinger
Claro, foi por isso que usei isso, duh! O que eu queria saber era se alguém poderia adicionar várias pastas a ele sem ter que mover ou criar links simbólicos.
Ustaman Sangat,
0

Muitas das respostas existentes presumem que você deseja definir isso para um projeto específico, mas eu precisei defini-lo para o próprio Eclipse a fim de oferecer suporte à autenticação integrada para o driver JDBC do SQL Server.

Para fazer isso, segui estas instruções para iniciar o Eclipse a partir da linha de comando Java em vez de seu inicializador normal. Então, apenas modifiquei esse script para adicionar meu argumento -Djava.library.path à linha de comando Java.

CrazyPyro
fonte
0
  1. No Windows: Adicione o caminho da biblioteca à variável de ambiente PATH.
  2. No Linux: Adicione o caminho à biblioteca para a variável de ambiente LD_LIBRARY_PATH.
  3. No Mac: adicione o caminho da biblioteca à variável de ambiente DYLD_LIBRARY_PATH.

java.library.path é inicializado com os valores das variáveis ​​acima em sua plataforma correspondente.

Isso deve funcionar em qualquer IDE.

Você pode testar se o valor é o que você espera chamando java -XshowSettings:properties

rboc
fonte
-2

No Windows, descobri que o importante é iniciar o Eclipse a partir da linha de comando em vez do Menu Iniciar ou de um atalho, desde que a DLL nativa esteja em um diretório em seu PATH. Aparentemente, isso garante que o diretório adequado esteja no caminho.

Alan
fonte
Corrija-me se estiver errado, mas acredito que o diretório de trabalho atual no Windows é incluído automaticamente ao pesquisar DLLs (ou binários executáveis). Portanto, quando você muda para a pasta onde estão as DLLs e inicia o Eclipse, sim, as DLLs que você está procurando são encontradas. Além disso, como esta resposta está relacionada à pergunta inicial do tópico?
Whaefelinger de