java add no caminho

0

Eu tenho alguns arquivos .jar em um diretório, /home/unix/dfernand/bin/picard/picard-tools-1.106 .

Mas quando eu adiciono o diretório ao PATH e CLASSPATH no meu bashrc, o java ainda não reconhece os arquivos .jar e não tenho idéia do motivo.

Eu tentei:

>export PATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$PATH"
> export CLASSPATH=$CLASSPATH:/home/unix/dfernand/bin/picard/picard-tools-1.106
> java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar
>export CLASSPATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$CLASSPATH"
>java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar

Se eu fizer,

[niveum]dfernand> java -jar /home/unix/dfernand/bin/picard/picard-tools-1.106/AddOrReplaceReadGroups.jar -h

funciona !, mas eu os quero no meu PATH/CLASSPATH

Alguém tem uma idéia de onde está meu bug? Tenho que adicionar mais alguma coisa ao PATH/CLASSPATH ? Estou usando alguma sintaxe errada?

    
por Dnaiel 21.01.2014 / 22:34

1 resposta

1

Primeiro, vamos esclarecer as diferenças entre as duas variáveis de ambiente e sua finalidade:

PATH é usado apenas pelo shell para localizar executáveis, por exemplo, java ou ls ou bash . Então você não precisa tocar nisso, a menos que o shell reclamar algo como java: command not found .

CLASSPATH é o que o Java está usando para encontrar a classe que será carregada. No entanto, funciona um pouco diferente de PATH : ele deve conter os caminhos para os arquivos .class , .zip ou .jar ou entradas com curingas.

Class paths to the .jar, .zip or .class files. Each classpath should end with a filename or directory depending on what you are setting the class path to:

  • For a .jar or .zip file that contains .class files, the class path ends with the name of the .zip or .jar file.

  • For .class files in an unnamed package, the class path ends with the directory that contains the .class files.

  • For .class files in a named package, the class path ends with the directory that contains the "root" package (the first package in the full package name). Class path entries can contain the basename wildcard character , which is considered equivalent to specifying a list of all the files in the directory with the extension .jar or .JAR. For example, the class path entry foo/ specifies all JAR files in the directory named foo. A classpath entry consisting simply of * expands to a list of all the jar files in the current directory.

A class path entry that contains * will not match class files. To match both classes and JAR files in a single directory foo, use either foo;foo/* or foo/*;foo. The order chosen determines whether the classes and resources in foo are loaded before JAR files in foo, or vice versa.

Nesse caso, você deve adicionar o caminho ao arquivo AddOrReplaceReadGroups.jar para CLASSPATH e, em seguida, chamar a classe com o nome completo do pacote para iniciar o aplicativo. A classe que está sendo chamada deve ser a que contém o método main() . Neste caso, não tenho ideia de qual é essa classe, mas um palpite após uma pesquisa no google é que a classe a ser chamada é net.sf.picard.sam.AddOrReplaceReadGroups .

But when classes are stored in an archive file (a .zip or .jar file) the class path entry is the path to and including the .zip or .jar file. For example, to use a class library that is in a .jar file, the command would look something like this:

C:> java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool

(citações acima de documentos do Oracle JavaSE7: definindo o caminho da classe , consulte também o tutorial Java em PATH e CLASSPATH para obter uma explicação mais completa sobre seus significados )

Assim, a linha de comando a ser usada depois de adicionar o caminho para AddOrReplaceReadGroups.jar to CLASSPATH deve ser:

> java net.sf.picard.sam.AddOrReplaceReadGroups

Se isso ainda for muito complicado, você pode colocar isso em um shell alias ou em um script.

Usando a abordagem de script, você também pode colocar diretamente a linha de comando que você mencionou na pergunta no script sem tocar na variável de ambiente. Esta realmente parece ser a maneira preferida de acordo com a documentação do Java, possivelmente pelo menos em parte, pois colocar muita coisa no CLASSPATH usado globalmente irá adicionar sobrecarga ao carregamento da classe, já que todos os lugares (não relacionados) mencionados no caminho de classe precisarão para ser visitado, também, para encontrar a classe a ser carregada. No entanto, não sei se isso pode ser um problema com os aplicativos da área de trabalho, a menos que o caminho de classe seja muito longo com muitos arquivos grandes. Evitar a adição de itens globalmente também evita conflitos de versões se muitos arquivos contiverem versões diferentes da mesma classe.

    
por 22.01.2014 / 13:47