Java 호출을 사용하지 않고 Java 프로그램 시작

Java 호출을 사용하지 않고 Java 프로그램 시작

터미널에서 클래스 파일을 호출하여 Java 프로그램을 시작할 수 있으면 편리할 것입니다(GUI에서 두 번 클릭하면 터미널에서 실행할 수 있지만 덜 중요합니다). 지금까지 나는 다음과 같은 임시 수정에만 도움을 주었습니다.

alias cs='java charstat.Charstat'

Linux는 다음 파일을 Java로 인식합니다.

 charstat/Charstat.class: compiled Java class data, version 52.0 (Java 1.8)

그렇다면 전화를 유선으로 연결하는 방법이 있습니까? 여기에 Ubuntu 16.04가 있지만 일반적인 답변을 환영합니다.


문제가 종료되고 문제 해결 부분이 시작됩니다.


고쳐 쓰다

지금까지 가장 유망한 행동 방침은 Gilles가 제안한 것입니다. 그래서 나는 다음을 실행했습니다.

echo ":java-class:M:0:cafebabe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register

지금,

tomasz@tomasz-Latitude-E4200:~/Desktop$ cat /proc/sys/fs/binfmt_misc/java-class
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic 6361666562616265

하지만,

tomasz@tomasz-Latitude-E4200:~/Desktop$ ./Void.class 
bash: ./Void.class: cannot execute binary file: Exec format error

이것은 Ubuntu 14.04에서 수행되었습니다. 그것은 다음을 가지고 있습니다 :

binfmt-support/trusty,now 2.1.4-1 amd64 [installed,automatic]
  Support for extra binary formats

중요한 경우 16.04에 자동으로 설치되지는 않는 것 같습니다.

어제 Mark Plotnick의 의견을 바탕으로 저는 다음과 같이 말했습니다.이 가이드, 소용이 없습니다. /usr/local/bin/javawrapperGilles의 솔루션에는 포함되지 않은 래퍼가 도입되었습니다 . 하지만 이것은 아치 리눅스용입니다.

업데이트 2(우분투 16.06)

16.06:

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ cat /proc/sys/fs/binfmt_misc/Java 
enabled
interpreter /usr/local/bin/javawrapper
flags: 
offset 0
magic cafebabe

그리고,

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Nain.class 
bash: ./Nain.class: No such file or directory

업데이트 3

뒤쪽에 echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register:

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ java Main 
Please input the file location and name.
^Ctomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Main.class 
Error: Could not find or load main class ..Main.class

참고로:

tomasz@tomasz-Latitude-E4200:/proc/sys/fs/binfmt_misc$ cat java-class 
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic cafebabe

답변1

리눅스

우분투는 이미 jar에 대해 이 작업을 수행하고 있습니다. 와 함께openjdk-8-jre 패키지(및 이전 버전) jar 호출이 수행됩니다 jexec. 클래스에 대해서는 이 작업이 수행되지 않습니다. 아마도 클래스가 라이브러리가 아닌 독립 실행형 실행 파일인 경우가 거의 없기 때문일 것입니다(다시 말하지만, jar에도 동일하게 적용됩니다).

클래스를 처리하기 위해 동일한 기본 메커니즘을 구성할 수 있습니다. 이 메커니즘은 Linuxbinfmt_misc커널이 도우미 프로그램을 통해 임의의 파일을 실행할 수 있도록 하는 기능입니다.

javaJava의 명령줄은 정말 이상하기 때문에 파일 이름을 명령이 실행할 수 있는 이름 으로 변환하려면 래퍼를 거쳐야 합니다 . 이 스크립트를 다른 이름으로 저장 /usr/local/bin/javarun하고 실행 가능하게 만듭니다.

#!/bin/sh
case "$1" in
  */*) dir="${1%/*}"; base="${1##*/}";;
  *) dir="."; base="$1";;
esac
shift
case "$base" in
  [!-]*.class) base="${base%.*}";;
  *) echo >&2 "Usage: $0 FILENAME.class [ARGS...]"; exit 127;;
esac
case "$CLASSPATH" in
  "") exec java -cp "$dir" "$base" "$@";;
  *) exec java -cp "$dir:$CLASSPATH" "$base" "$@";;
esac

다음 명령은 클래스에 작동합니다. 보다https://unix.stackexchange.com/a/21651그리고커널 문서 설명을 위해.

echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:" | sudo tee /proc/sys/fs/binfmt_misc/register

활성화하려면 한 번 실행하세요. 설정을 제거하려면 을 실행합니다 sudo rm /proc/sys/fs/binfmt_misc/java-class. 설정에 만족하면 다음 명령을 추가합니다 /etc/rc.local.

echo >/proc/sys/fs/binfmt_misc/register ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:"

지쉬

당신이 사용하는 경우다루기 힘든쉘로서 다음을 정의하여 확장자를 기반으로 파일을 실행하도록 할 수 있습니다.접미사 별칭.

alias -s class=javarun

javarun위와 동일한 스크립트가 필요합니다 . 물론 이것은 bash, 파일 관리자, 스크립트(이 명령을 실행하는 zsh 스크립트 제외)가 아닌 zsh에서만 작동합니다.

답변2

".class"에 대한 mailcap 프로젝트를 정의하고 브라우저(또는 데스크톱 실행 프로그램)가 이를 사용하도록 설득할 수 있습니다.

그러나 이것은 단지 변화일 뿐이다.어느실행을 시작하기 위해 실행하는 프로그램입니다(실제 절약은 없음). 데스크탑 런처도 마찬가지입니다.

추가 자료:

관련 정보