Existe uma maneira de incluir todos os arquivos jar em um diretório no caminho de classe?
Estou tentando java -classpath lib/*.jar:. my.package.Program
e não é possível encontrar arquivos de classe que certamente estão nesses frascos. Preciso adicionar cada arquivo jar ao caminho de classe separadamente?
java
command-line
classpath
Chris Serra
fonte
fonte
.jar
peça, (2) deve ter pelo menos 2 partes, separadas por uma;
no Windows (que geralmente está em:
outro lugar). Por exemplo:java -classpath ".;lib/*" Program
Respostas:
Usando o Java 6 ou posterior, a opção classpath suporta caracteres curinga. Observe o seguinte:
"
)*
, não*.jar
janelas
Unix
Isso é semelhante ao Windows, mas usa em
:
vez de;
. Se você não puder usar curingas,bash
permita a seguinte sintaxe (ondelib
está o diretório que contém todos os arquivos archive Java):(Observe que o uso de um caminho de classe é incompatível com a
-jar
opção. Consulte também: Executar arquivo jar com várias bibliotecas de caminho de classe no prompt de comando )Noções básicas sobre curingas
No documento Classpath :
Nota: devido a um bug conhecido no java 8, os exemplos do Windows devem usar uma barra invertida que precede as entradas com um asterisco à direita: https://bugs.openjdk.java.net/browse/JDK-8131329
fonte
tr
funciona!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
sem aspas e funciona bem. Eu estou querendo saber por que shell não está expandindo e errando?~
na -cpNo Windows, isso funciona:
e isso não funciona:
observe o * .jar, portanto , o curinga * deve ser usado sozinho .
No Linux, o seguinte funciona:
Os separadores são dois pontos em vez de ponto e vírgula.
fonte
*.jar
mas apenas com*
.:
uma plataforma e;
a outra. :) Eu compilo com Java a partir da linha de comando cerca de uma vez por ano, apenas o suficiente para não lembrar quantas vezes o suficiente para ser chato.Contornamos esse problema implantando um arquivo jar principal
myapp.jar
que contém um arquivo manifest (Manifest.mf
) especificando um caminho de classe com os outros jars necessários, que são implantados ao lado dele. Nesse caso, você só precisa declararjava -jar myapp.jar
ao executar o código.Portanto, se você implantar o main
jar
em algum diretório e, em seguida, colocar os jars dependentes em umalib
pasta abaixo, o manifesto será semelhante a:Nota: isso é independente da plataforma - podemos usar os mesmos jars para iniciar em um servidor UNIX ou em um PC com Windows.
fonte
Minha solução no Ubuntu 10.04 usando o java-sun 1.6.0_24 com todos os jars no diretório "lib":
Se isso falhar, o seguinte comando deverá funcionar (imprime todos os * .jars no diretório lib no parâmetro classpath)
fonte
Resposta curta:
java -classpath lib/*:. my.package.Program
A Oracle fornece documentação sobre o uso de curingas em caminhos de classe aqui para Java 6 e aqui para Java 7 , sob o cabeçalho da seção Noções básicas sobre curingas de caminho de classe . (Enquanto escrevo isso, as duas páginas contêm as mesmas informações.) Aqui está um resumo dos destaques:
Em geral, para incluir todos os JARs em um determinado diretório, você pode usar o curinga
*
( não*.jar
).O curinga corresponde apenas aos JARs, não aos arquivos de classe; para obter todas as classes em um diretório, termine a entrada do caminho de classe no nome do diretório.
As duas opções acima podem ser combinadas para incluir todos os arquivos JAR e de classe em um diretório, e as regras usuais de precedência de caminho de classe se aplicam. Por exemplo
-cp /classes;/jars/*
O curinga não procurará JARs nos subdiretórios.
Os pontos acima são verdadeiras se você usar a
CLASSPATH
propriedade do sistema ou os-cp
ou-classpath
comando sinalizadores de linha. No entanto, se você usar oClass-Path
cabeçalho do manifesto JAR (como faria com um arquivo de construção de formiga), os curingas não serão respeitados.Sim, meu primeiro link é o mesmo fornecido na resposta com pontuação mais alta (que eu não tenho esperança de ultrapassar), mas essa resposta não fornece muita explicação além do link. Como esse tipo de comportamento é desencorajado no Stack Overflow hoje em dia , pensei em expandir.
fonte
Windows :
Linux :
Lembre:
- O separador de caminhos do Windows é
;
- O separador de caminhos do Linux é
:
- No Windows, se o argumento cp não contiver espaço em branco, as "aspas" serão opcionais
fonte
Para mim, isso funciona no Windows.
Para linux
Estou usando Java 6
fonte
Você pode experimentar java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlDiretório para jars externos ao executar java
fonte
-Djava.ext.dirs=
ANTES-jar
Correto :
Incorreta:
fonte
Se você realmente precisar especificar todos os arquivos .jar dinamicamente, poderá usar scripts de shell ou Apache Ant . Existe um projeto comum chamado Commons Launcher que basicamente permite que você especifique seu script de inicialização como um arquivo de construção de formiga (se você entende o que eu quero dizer).
Em seguida, você pode especificar algo como:
No seu arquivo de compilação de inicialização, que iniciará seu aplicativo com o caminho de classe correto.
fonte
Se você estiver usando o Java 6, poderá usar curingas no caminho de classe.
Agora é possível usar caracteres curinga na definição de caminho de classe:
Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
fonte
Observe que a expansão do curinga está interrompida para o Java 7 no Windows.
Confira este problema do StackOverflow para obter mais informações.
A solução alternativa é colocar um ponto-e-vírgula logo após o curinga.
java -cp "somewhere/*;"
fonte
A quem possa interessar,
Eu encontrei esse comportamento estranho no Windows sob um shell MSYS / MinGW.
Trabalho:
Não funciona:
Tenho certeza de que o curinga não é expandido pelo shell, porque, por exemplo,
(Tentei também com outro programa, em vez do incorporado
echo
, com o mesmo resultado.)Acredito que é isso
javac
que está tentando expandi-lo, e se comporta de maneira diferente se existe um ponto e vírgula no argumento ou não. Primeiro, pode estar tentando expandir todos os argumentos que parecem caminhos. E só então os analisaria,-cp
usando apenas o seguinte token. (Observe quecom.comsol.aco_1.0.0.jar
é o segundo JAR nesse diretório.) Isso é apenas um palpite.Isto é
fonte
Todas as soluções acima funcionam muito bem se você desenvolver e executar o aplicativo Java fora de qualquer IDE como Eclipse ou Netbeans.
Se você estiver no Windows 7 e usou o Eclipse IDE for Development em Java, poderá encontrar problemas se estiver usando o Prompt de Comando para executar os arquivos de classe criados dentro do Eclipse.
Por exemplo, seu código-fonte no Eclipse está com a seguinte hierarquia de pacotes: edu.sjsu.myapp.Main.java
Você tem o json.jar como uma dependência externa para o Main.java
Quando você tenta executar o Main.java no Eclipse, ele será executado sem problemas.
Mas quando você tenta executar isso usando o Prompt de Comando após compilar o Main.java no Eclipse, ele dispara alguns erros estranhos dizendo "ClassNotDef Error blah blah".
Presumo que você esteja no diretório de trabalho do seu código-fonte !!
Use a seguinte sintaxe para executá-lo no prompt de comando:
[Não perca a. acima]
Isso ocorre porque você colocou o Main.java dentro do pacote edu.sjsu.myapp e o java.exe procurará o padrão exato.
Espero que ajude !!
fonte
Para Windows, são necessárias aspas e; deve ser usado como separador. por exemplo:
fonte
Forma abreviada: Se o seu main estiver dentro de um jar, você provavelmente precisará de um adicional '-jar pathTo / yourJar / YourJarsName.jar' declarado explicitamente para fazê-lo funcionar (mesmo que 'YourJarsName.jar' esteja no caminho de classe) (ou , expressa para responder à pergunta original que foi feita há 5 anos: você não precisa redeclarar cada frasco explicitamente, mas parece que, mesmo com java6, você precisa redeclarar seu próprio frasco ...)
Forma Longa: (Eu expliquei isso ao ponto que espero que até intrusos no java possam fazer uso disso)
Como muitos aqui, estou usando o eclipse para exportar jarros: (Arquivo-> Exportar -> 'Arquivo JAR Runnable'). Existem três opções nas ofertas do eclipse 'Library handling' (Juno):
Normalmente, eu usaria opt2 (e opt1 estava definitivamente quebrando), no entanto, o código nativo em um dos jarros que estou usando descobri quebras com o prático truque "jarinjar" que o eclipse utiliza quando você escolhe essa opção. Mesmo depois de perceber que eu precisava do opt3 e encontrar a entrada StackOverflow, ainda levei algum tempo para descobrir como iniciar meu principal fora do eclipse, então aqui está o que funcionou para mim, pois é útil para outros ...
Se você nomeou seu jar: "fooBarTheJarFile.jar" e tudo está definido para exportar para o diretório: "/ theFully / qualificadoPath / toYourChosenDir".
(significando que o campo 'Exportar destino' será: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')
Depois de concluir, você encontrará o eclipse e colocará todas as bibliotecas em uma pasta chamada 'fooBarTheJarFile_lib' dentro desse diretório de exportação, oferecendo algo como:
Você pode iniciar a partir de qualquer lugar no seu sistema com:
(Para iniciantes em Java: 'package.path_to.the_class_with.your_main' é o caminho do pacote declarado que você encontrará na parte superior do arquivo 'TheClassWithYourMain.java' que contém os 'main (String [] args) {.. .} 'que você deseja executar de fora do java)
A armadilha a ser observada: é que ter 'fooBarTheJarFile.jar' na lista de jars no caminho de classe declarado não é suficiente. Você precisa declarar explicitamente '-jar' e redeclarar a localização desse jar.
por exemplo, isso quebra:
atualizado com caminhos relativos:
(usando a versão java "1.6.0_27"; via VM do servidor OpenJDK de 64 bits no ubuntu 12.04)
fonte
A única maneira de saber como fazê-lo individualmente, por exemplo:
Espero que ajude!
fonte
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
classe de wepapp:
fonte
Você precisa adicioná-los todos separadamente. Como alternativa, se você realmente precisar apenas especificar um diretório, poderá descompactar tudo em um diretório e adicioná-lo ao seu caminho de classe. No entanto, não recomendo esta abordagem, pois você corre o risco de problemas bizarros no controle de versão do classpath e na impossibilidade de gerenciamento.
fonte
Não é uma solução direta para definir / * como -cp, mas espero que você possa usar o script a seguir para facilitar um pouco a situação para caminhos de classe dinâmicos e diretórios lib.
Com script para Linux, poderia ter um similar para o Windows também. Se o diretório adequado for fornecido como entrada para "libDir2Scan4jars"; o script varrerá todos os jars e criará uma sequência de caminho de classe e exportará para uma variável env "tmpCLASSPATH".
fonte
macOS, pasta atual
Para Java 13 no macOS Mojave …
Se todos os seus
.jar
arquivos estiverem na mesma pasta, usecd
para tornar esse seu diretório de trabalho atual . Verifique compwd
.Para o
-classpath
primeiro, você deve listar o arquivo JAR do seu aplicativo. Usando um caractere de dois pontos:
como delimitador, anexe um asterisco*
para obter todos os outros arquivos JAR na mesma pasta. Por fim, passe o nome completo do pacote da classe com seumain
método .Por exemplo, para um aplicativo em um arquivo JAR nomeado
my_app.jar
com ummain
método em uma classe nomeadaApp
em um pacote nomeadocom.example
, ao lado de alguns jars necessários na mesma pasta:fonte
Pense em um arquivo jar como a raiz de uma estrutura de diretório. Sim, você precisa adicioná-los todos separadamente.
fonte
Defina o caminho da classe de uma maneira adequada para vários jars e os arquivos de classe do diretório atual.
fonte
Eu tenho vários frascos em uma pasta. O comando abaixo trabalhou para mim
JDK1.8
para incluir todos os frascos presentes na pasta. Observe que para incluir aspas se você tiver um espaço no caminho de classejanelas
Compilando:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Corrida:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Compilando:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Corrida:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
fonte
Estou tentando executar o arquivo Java como jar ou como classes no Ubuntu. Eu falhei nas duas opções. A seguinte exceção é sua saída.
ou
ou
Eu encontrei a resposta:
Minha estupidez.
Primeiro passo: você deve definir o Java correspondente: eu tinha o Java 11, mas defini como caminho da lib Java a 8ª versão! - Você pode definir a versão Java aqui:
2º passo: Em seguida, execute o seguinte comando, alterando o caminho e os nomes de arquivo para o caminho e os arquivos correspondentes:
Foi executado com sucesso!
fonte