Como usar classes de arquivos .jar?

134

Eu li os tutoriais de Java no Sun para arquivos JAR, mas ainda não consigo encontrar uma solução para o meu problema. Preciso usar uma classe de um arquivo jar chamado jtwitter.jar, baixei o arquivo e tentei executá-lo (descobri ontem que os arquivos .jar podem ser executados clicando duas vezes neles) e o Vista me deu um erro dizendo " Falha ao carregar o atributo Manifest da Classe Principal de [path] /jtwitter.jar ".

O cara que codificou o arquivo .jar deseja que eu importe-o, mas onde armazeno o arquivo .jar para importá-lo no meu código? Tentei colocar o arquivo .jar e o meu arquivo .java no mesmo diretório, não funcionou.

O arquivo para o qual estou tentando trabalhar está aqui: http://www.winterwell.com/software/jtwitter.php

Estou usando o JCreator LE.

Gaurav Dadhania
fonte
13
Por que há um voto negativo? Na minha opinião, é uma boa pergunta e há informações interessantes nas respostas! (+1)
guerda

Respostas:

34

Nem todo arquivo jar é executável.

Agora, você precisa importar as classes, que estão lá embaixo do jar, no seu arquivo java. Por exemplo,

import org.xml.sax.SAXException;

Se você estiver trabalhando em um IDE, consulte a documentação. Ou pelo menos especifique qual você está usando aqui neste tópico. Definitivamente nos permitiria ajudá-lo ainda mais.

E se você não estiver usando nenhum IDE, consulte a opção javac -cp . No entanto, é uma idéia muito melhor empacotar seu programa em um jararquivo e incluir todos os jars necessários . Então, para executar seu jar, como,

java -jar my_program.jar

você deve ter um META-INF/MANIFEST.MFarquivo no seu jar. Veja aqui , como fazer.

Adeel Ansari
fonte
antigo, eu sei, mas, na verdade, não há necessidade de importnada - apenas evita a necessidade de escrever o nome completo da classe, seja qual for a classe usada, permitindo apenas o nome simples da classe ( SAXException) - meio que apenas importando o espaço para nome
user85421
173

Digamos que precisamos usar a classe Classnameque está contida no arquivo jarorg.example.jar

E sua fonte está no arquivo mysource.javaassim:

import org.example.Classname;

public class mysource {
    public static void main(String[] argv) {
    ......
   }
}

Primeiro, como você vê, no seu código você precisa importar as classes. Para fazer isso você precisaimport org.example.Classname;

Segundo, quando você compila a fonte, é necessário fazer referência ao arquivo jar.

Observe a diferença no uso :e ;durante a compilação

  • Se você estiver em um sistema operacional unix como o sistema operacional:

    javac -cp '.:org.example.jar' mysource.java
  • Se você estiver no Windows:

    javac -cp .;org.example.jar mysource.java

Depois disso, você obtém o arquivo bytecode mysource.class

Agora você pode executar isso:

  • Se você estiver em um sistema operacional unix como o sistema operacional:

    java -cp '.:org.example.jar' mysource
  • Se você estiver no Windows:

    java -cp .;org.example.jar mysource
GabrieleV
fonte
4
Você poderia explicar essa notação um pouco mais? Isso resolveu o meu problema, mas infelizmente não tenho NENHUMA IDEIA o que o ponto-e-vírgula / dois pontos significa nesse caso específico.
cemulate
2
Essa história de ponto-e-vírgula / cólon me custou o dia inteiro. Pelo menos eu encontrei agora, obrigado!
Maxim Zubarev
1
@ChaseMeadors O ponto- e- vírgula / dois pontos significa essencialmente "e" aqui. É a separação .de org.example.jar.
Duozmo 26/05
Se você estiver pesquisando, preste atenção à maioria das *PATHvariáveis: os arquivos .jar precisam ser nomeados individualmente .
Duozmo 26/05
15

Você precisa adicionar o arquivo jar no caminho de classe. Para compilar sua classe java:

javac -cp .;jwitter.jar MyClass.java

Para executar seu código (desde que MyClass contenha um método principal):

java -cp .;jwitter.jar MyClass

Você pode ter o arquivo jar em qualquer lugar. O trabalho acima se o arquivo jar estiver no mesmo diretório que o seu arquivo java.

kgiannakakis
fonte
7

Você precisa colocar o arquivo .jar em seu caminho de classe ao compilar / executar seu código. Então você apenas usa importações padrão das classes no .jar.

workmad3
fonte
6

Como o workmad3 diz, você precisa que o arquivo jar esteja no seu caminho de classe. Se você estiver compilando a partir da linha de comando, isso significa usar o sinalizador -classpath. (Evite a variável de ambiente CLASSPATH; é uma dor no pescoço IMO.)

Se você estiver usando um IDE, informe-nos e podemos ajudá-lo com as etapas específicas desse IDE.

Jon Skeet
fonte
A variável env do classpath é útil se você estiver usando scripts ou algo como o firedaemon para executar seu aplicativo. É só uma dor quando você usá-lo globalmente :)
workmad3
Eu ainda gosto de vê-lo explicitamente.
Jon Skeet
Eu concordo, eu gosto de vê-lo explicitamente.
J3r3myK