모든 사용자를 위해 설치하고 싶은 Java 명령줄 프로그램이 많이 있습니다.
/dist
NetBeans를 사용하여 빌드하면 필요한 모든 라이브러리가 포함된 디렉터리가 생성됩니다 myprog1.jar
. /libs
그것을 실행하는 일반적인 방법은 거기로 가서 java -jar my.jar -options
.
그래서 제가 하고 싶은 것은 myprog1 -options
어디에서나 입력하고 실행하는 것입니다.
제가 생각한 방법은 다음과 같습니다.
- 및 을
/opt/myjava/myprog1
포함하는 생성 .myprog1.jar
/libs
- 모든 명령줄 인수를 간단히 리디렉션하는
myprog1
bash 스크립트를 만듭니다 ./usr/local/bin
java -jar /opt/myjava/myprog1/myprog1.jar
저는 bash 스크립트를 그다지 좋아하지 않습니다... 이것이 합리적인 접근 방식이라면 각 프로그램에 가변적인 수와 매개 변수 순서가 있다는 점을 고려할 때 스크립트는 어떻게 생겼을까요? 스크립트는 출력 리디렉션 >
및 파이프 와 같은 표준 Unix 비트에 대해서도 걱정해야 합니까 |
?
답변1
Bash 및 Java 실행 파일은 리디렉션된 콘텐츠를 처리하는 방법을 알고 있습니다. exec
쉘 스크립트를 실행하는 대신 스크립트 해석기를 사용하려고 합니다 .
#!/bin/bash
exec java -jar ....jar "$@"
답변2
호출된 방식으로 명명된 jar를 실행하고 각 jar에 대한 심볼릭 링크를 생성하는 래퍼 스크립트를 작성할 수 있습니다. 다음은 jar-wrapper 스크립트입니다(경고, 브라우저에 직접 입력).
#!/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" "$@"
$PATH
그런 다음 원하는 만큼 래퍼 스크립트에 대한 심볼릭 링크를 만들고 다음 위치에 넣습니다.
ln -s wrapper-script myprog1
ln -s wrapper-script myprog2
Linux를 실행 중이고 시스템 관리자인 경우 Java 인터프리터를 선택하여 jar를 직접 실행 가능하게 만들 수 있습니다.binfmt_misc기구.
예를 들어 내 시스템에서는 다음과 같습니다.
$ 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
시스템은 다음과 같이 기록됩니다.Documentation/binfmt_misc.txt
Linux 커널 문서에 있습니다. 위와 유사한 항목을 만들려면 다음 명령을 실행하세요.
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:"
배포판에는 부팅 시 binfmt를 등록하는 메커니즘이 있을 수 있습니다. 데비안과 그 파생물에서는 다음과 같습니다.update-binfmts
, JVM 패키지가 등록되었습니다 jexec
.
옵션을 전달해야 하는 경우 옵션을 직접 추가하는 대신 래퍼 스크립트를 등록하여 옵션을 추가하세요 jexec
.