2012-02-09 3 views
2

문제점 : 안녕하세요 세계 Java 프로그램을 작성하여 컴파일하고 jar 파일을 작성했습니다. 거기에는 문제가 없습니다.캔트 패키지에 추가 된 경우 항아리 컴파일

는 지금 모든 권리 디렉토리에있는 파일과 내가이 배치 파일

del *.class 
del *.jar 
del *.txt 

echo compiling HelloWorld.java..... 

javac HelloWorld.java 

javap -c HelloWorld.class > ByteCode.txt 

jar cfe HelloWorld.jar HelloWorld HelloWorld.class 

java -jar za.ac.uj.csc2a.HelloWorld.jar 
컴파일 할 때마다 배치,

package za.ac.uj.csc2a; 

코드를 저장 한 소스 코드의 상단에 다음을 추가

난 ....

Error: Unable to acces jarfile za.ac.uj.csc2a.HelloWorld.jar 

어떤 조언을 얻을


여기 -jar 옵션은 파일 이름 아닌 클래스을 받아

에이든

답변

1
: 당신이 매니페스트 파일에 가고 싶지 않으면 그것은 당신이 또한 (아마도 그건 당신이하려고하는 기능)이처럼 발사 수는 za.ac.uj.csc2a 디렉토리


에 있어야합니다

jar cfe HelloWorld.jar HelloWorld HelloWorld.class 

하지만 당신은 단지에 접두어로 패키지 이름과 전화 :

귀하의 항아리는 례 HelloWorld.jar 이름

java -jar za/ac/uj/csc2a/HelloWorld.jar 

java -jar HelloWorld.jar 

이어야합니다.

일반적으로 패키지를 사용하는 경우 클래스와 소스를 다른 디렉토리에 넣습니다.당신은 SRC 디렉토리로 이동 한 후 컴파일 할 수

proj 
|-- src 
| |-- za 
|  |-- ac 
|   `-- HelloWorld.java 
|-- bin 
    |-- za 
     |-- ac 
      `-- HelloWorld.class 

같은 일반적인 나무 같습니다

javac -d ../bin za/ac/HelloWorld.java 

bin 디렉토리 구조를 생성합니다 (편의를 위해 패키지/경로 길이를 감소) (또는 자주 classes) 필요한 경우

다음

, 올바른 디렉토리 구조로 모든 것을 항아리에, 당신은 proj로 변경하고, 문제 :

jar cfe HelloWorld.jar za.ac.HelloWorld -C bin . 

점은 전체 디렉토리를 나타냅니다.

jar -help 

더 많은 옵션을 알려드립니다. 실행 가능한 항아리를 만들려면 매니페스트도 필요합니다. 그렇지 않으면 앱을 시작할 수 있습니다.

java -cp HelloWorld.jar za.ac.HelloWorld 

(다시 경로가 짧아집니다).

디렉터리의 구조는 패키지 선언을 반영해야합니다. 파트 (za)를 생략하고 다음 디렉토리 (ac)로 들어갈 수 없습니다. 실행할 클래스는 za.ac.HelloWorld이므로 za/ac /에서 파일 시스템이나 항아리에 관계없이 검색됩니다.

올바른 기본 명령을 실행하는 방법을 배우면 쉽습니다. 그렇지 않으면 몇 년의 시행 착오를 겪을 것입니다.

java -jar으로 시동 가능한 항아리에는 매니페스트가 필요합니다. 템플리트는 jar 명령에 의해 생성됩니다. 여기에 다음을 추가하십시오.

Main-Class: za.ac.HelloWorld 

다음 빈 줄이 있습니다. 다시 : 패키지와 함께 전체 이름이 필요합니다. Main-Class은 Mainclass로 쓸 수 없습니다. HelloWorld 뒤에는 .class 또는 .java가 없어야합니다. 일반적인 실수입니다! 그러나 알다시피, -e 스위치를 사용하여 기본 클래스를 지정할 수 있지만 다시 : 패키지 이름을 포함하십시오.

+0

매니페스트 파일이있는 것처럼 보이지 않으므로'-jar'로 시작하면 예상대로 작동하지 않을 수 있습니다. – aioobe

+0

그건 또 다른 문제입니다. –

+0

@aioobe의 경우 jar 도구는 Main-Class가없는 기본 매니페스트를 만듭니다. 전자 스위치를 추가하면 항아리에 대한 진입 점을 설정할 수 있습니다. 따라서 사용자가 unknwn에 따라 jarring에 대한 내 진술은 다음과 같아야합니다.> jar cfe HelloWorld.jar za.ac.uj.csc2a.HelloWorld -C bin –

2

많이

del *.class 
del *.jar 
del *.txt 
RD /Q /S bin 

echo compiling HelloWorld.java..... 

MD bin 

javac -d bin za/ac/uj/csc2a/HelloWorld.java 
javap -c bin/za/ac/uj/csc2a/HelloWorld.class > ByteCode.txt 
jar cfe HelloWorld.jar za.ac.uj.csc2a.HelloWorld -C bin . 
java -jar HelloWorld.jar 
pause 

덕분에 작동 최종 박쥐 파일입니다.

당신은

java -jar HelloWorld.jar 

을해야하지만 당신은 당신이 당신이이 -jar 옵션을 사용하여 실행하고자하는 매니페스트 파일의 메인 클래스를 지정해야합니다 명심하십시오.

매니페스트 파일은

Main-Class: za.ac.uj.csc2a.HelloWorld 

과 같아야합니다 그리고 당신은 jar 명령에 m 옵션으로 포함되어 있습니다.

또한 jar 파일의 루트에 .class-file을 추가하는 것으로 보입니다.

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld 
+0

내가 그런 다음이 java.lang.NoClassDefFoundError가 얻을 일치해야합니다하여 HelloWorld (잘못된 이름 : ZA/AC/UJ/csc2a /하여 HelloWorld) java.lang.ClassLoader의에서 을. defineClass0 (네이티브 메소드) at java.lang.ClassLoader.defineClass (ClassLoader.java:442) at java.security.SecureClassLoader.defineClass (Se –

+0

답변 됨. 또한 jar 파일의 루트에'.class' 파일을 추가하는 것 같습니다. 그것은'za.ac.uj.csc2a' 디렉토리에 있어야합니다. – aioobe

+0

@AidenStrydom JAR 파일의'HelloWorld.class'는 JAR의 루트 디렉토리가 아닌 오른쪽 서브 디렉토리에 있어야하기 때문에. – Jesper

0

jar 파일의 이름은 za.ac.uj.csc2a.HelloWorld.jar이 아닌 HelloWorld.jar입니다. 그래서 분명히, 자바는 그것을 찾지 못한다.

JAR 파일 내용 그렇게 jar 파일 내부의 HelloWorld.class 폴더 za/ac/uj/csc2a에 있어야합니다, 패키지의 계층 구조를 존중해야합니다.

+0

고맙습니다 지금 당장 시도 할게요. –

0

당신은 실제로 례 HelloWorld.jar 대신 자바

0

place all the files in the right directories

당신이 그것에 대해 확실 -jar za.ac.uj.csc2a.HelloWorld.jar -jar 자바를 호출해야?코드가 패키지 za.ac.uj.csc2a에있는 경우 다음 소스 파일이 디렉토리 za\ac\uj\csc2a에 있어야하기 때문에,이 같은 명령을 사용하여 컴파일해야합니다

javac za\ac\uj\csc2a\HelloWorld.java 

또한 JAR 내부는 디렉토리와 내부에 있어야한다 파일을 그 이름이 같은 명령을 사용하여 JAR 패키지해야하므로 :

jar cf HelloWorld.jar za\ac\uj\csc2a\HelloWorld.class 

당신은 단지 그것을 실행 항아리 인 경우에 매니페스트 파일을 추가하는 경우, 즉, java -jar 그것을 실행할 수 있습니다 올바른 Main-Class 속성을 가진 JAR 당신이

그것을 실행할 수 있도록 실행 JAR 파일에 응용 프로그램을 포장하는 방법에 대한 자세한 내용은 Packaging Programs in JAR Files를 참조

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld 

:이 작업을 수행하지 않은 경우와 JAR에서 실행할 수 있어야합니다 당신 례 HelloWorld.jar라는 항아리 만드는

java -jar HelloWorld.jar 
0

: 그런 다음 다른 항아리 이름을 불러들이려고

jar cfe HelloWorld.jar HelloWorld HelloWorld.class 

(za.ac.uj.csc2a.HelloWorld.jar) :

java -jar za.ac.uj.csc2a.HelloWorld.jar 

그들은

관련 문제