Como instalo vários programas de linha de comando java?

2

Eu tenho um monte de programas de linha de comando java que eu escrevi e gostaria de instalar para todos os usuários.

Criando com o NetBeans, recebo um diretório /dist que contém o diretório myprog1.jar e /libs com todas as bibliotecas necessárias. O método usual para executar é ir até lá e java -jar my.jar -options .

Então, o que eu gostaria de fazer é digitar myprog1 -options de qualquer lugar e executá-lo.

O método em que pensei é:

  1. Crie /opt/myjava/myprog1 , que contém myprog1.jar e seus /libs .
  2. Crie um script bash myprog1 in /usr/local/bin que simplesmente redireciona todos os argumentos da linha de comando para java -jar /opt/myjava/myprog1/myprog1.jar

Eu não estou muito interessado em bash scripting ... se este é um método razoável, o que seria esse script, dado que cada programa tem um número variável e ordem de argumentos? O script também precisa se preocupar com bits Unix padrão, como redirecionamento de saída > e pipes | ?

    
por Pete 28.09.2011 / 05:00

2 respostas

1

Você pode escrever um único script de wrapper que executa um jar com o nome da maneira como é chamado e criar um link simbólico para cada jar. Aqui está o script jar-wrapper (aviso, digitado diretamente no navegador):

#!/bin/sh
name=$(basename "$0")
jar=
for dir in /opt/myjava/*; do
  if [ -e "$dir/$name.jar" ]; then jar=$dir/$name.jar; break; fi
done
if [ -z "$jar" ]; then
  echo 1>&2 "$name.jar not found"
  exit 126
fi
exec /your/favorite/java -jar "$jar" "$@"

Em seguida, crie quantos links simbólicos para o script de wrapper desejar e coloque-os em $PATH , se desejar:

ln -s wrapper-script myprog1
ln -s wrapper-script myprog2

Se você estiver executando o Linux e for o administrador do sistema, poderá selecionar um interpretador Java para tornar os jars diretamente executáveis, graças ao binfmt_misc .

Por exemplo, no meu sistema:

$ cat /proc/sys/fs/binfmt_misc/jar
enabled
interpreter /usr/lib/jvm/java-6-sun-1.6.0.07/jre/lib/jexec
flags: 
offset 0
magic 504b0304

Este sistema está documentado em Documentation/binfmt_misc.txt na documentação do kernel Linux. Para criar uma entrada como a acima, execute o comando

jexec=/usr/lib/jvm/java-6-sun-1.6.0.07/jre/lib/jexec
echo >/proc/sys/fs/binfmt_misc/register ":jar:M:0:504b0304::$jexec:"

Sua distribuição pode ter um mecanismo para o registro do binfmt no momento da inicialização. No Debian e derivados, isto é update-binfmts , e os pacotes da JVM já registram jexec .

Se você precisar passar opções, registre um script de wrapper que adicione as opções em vez de jexec diretamente.

    
por 28.09.2011 / 22:36
3

O Bash e o executável Java sabem como lidar com o material de redirecionamento. Você deseja usar exec para substituir o interpretador de script que está executando o script de shell.

#!/bin/bash
exec java -jar ....jar "$@"
    
por 28.09.2011 / 05:21