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 )


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.


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 .


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.


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


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

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}"

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.


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!


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


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 "


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.


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.


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


-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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.