Java 클래스 경로 내의 디렉토리에 모든 jar 포함


1018

클래스 경로의 디렉토리에 모든 jar 파일을 포함시키는 방법이 있습니까?

노력 java -classpath lib/*.jar:. my.package.Program하고 있는데 그 항아리에있는 클래스 파일을 찾을 수 없습니다. 각 jar 파일을 클래스 경로에 별도로 추가해야합니까?


3
이걸 받아 본 적이 없어서 미안해 커뮤니티 위키 여야합니다. 제공된 답변 중 하나를 사용하지 마십시오. 방금 lib / 디렉토리를 스캔하고 파싱 파일 이름에서 클래스 경로를 생성하는 쉘 스크립트를 생성했다고 생각합니다.
Chris Serra

이 새로운 Java 기능에는 설명 된대로 작동하지 않기 때문에 일종의 버그가 있습니다. 답변 중 하나에 설명 된 것처럼 Ant를 포기하고 해결했습니다.
Alex R


1
Windows에서 와일드 카드 처리에 문제가 있습니다. stackoverflow.com/questions/11607873/…
Mykhaylo Adamovych

6
짧은 대답 : (1) .jar부품을 떨어 뜨리고 (2) Windows에서 (일반적으로 다른 곳으로) 구분 된 두 개 이상의 부품; 이 있어야합니다 :. 예를 들면 다음과 같습니다.java -classpath ".;lib/*" Program
Evgeni Sergeev

답변:


1159

Java 6 이상을 사용하는 classpath 옵션은 와일드 카드를 지원합니다. 다음에 유의하십시오.

  • 따옴표 ( ") 사용
  • 사용 *하지 말고 사용*.jar

윈도우

java -cp "Test.jar;lib/*" my.package.MainClass

유닉스

java -cp "Test.jar:lib/*" my.package.MainClass

이것은 Windows와 비슷하지만 :대신 사용 합니다 ;. 와일드 카드를 사용할 수없는 경우bash 다음 구문을 허용하십시오 ( lib모든 Java 아카이브 파일이 포함 된 디렉토리).

java -cp $(echo lib/*.jar | tr ' ' ':')

(클래스 경로 사용은 -jar옵션 과 호환되지 않습니다 . 참조 : 명령 프롬프트에서 여러 클래스 경로 라이브러리로 jar 파일 실행 )

와일드 카드 이해

로부터 클래스 경로 문서 :

클래스 경로 항목은 기본 이름 와일드 카드 문자를 포함 할 수 있으며 *, 확장자가있는 디렉토리의 모든 파일 목록을 지정하는 것과 같습니다..jar 또는로.JAR . 예를 들어, 클래스 경로 항목 foo/*은 foo라는 디렉토리의 모든 JAR 파일을 지정합니다. 단순히 구성된 클래스 경로 항목 *은 현재 디렉토리의 모든 jar 파일 목록 으로 확장됩니다.

포함 된 클래스 경로 항목이 *클래스 파일과 일치하지 않습니다. 단일 디렉토리 foo에서 클래스와 JAR 파일을 모두 일치 시키려면 foo;foo/*또는foo/*;foo . 선택한 순서에 따라 클래스 및 리소스 foo가 JAR 파일보다 먼저로드 되는지 foo또는 그 반대로 로드 되는지가 결정 됩니다.

서브 디렉토리는 재귀 적으로 검색되지 않습니다. 예를 들어 foo/*JAR 파일은foo ,하지에 foo/bar, foo/baz

디렉토리의 JAR 파일이 확장 된 클래스 경로에 열거되는 순서는 지정되지 않았으며 플랫폼에 따라, 심지어 동일한 머신에서 순간에 따라 다를 수도 있습니다. 잘 구성된 응용 프로그램은 특정 순서에 의존해서는 안됩니다. 특정 순서가 필요한 경우 클래스 파일에서 JAR 파일을 명시 적으로 열거 할 수 있습니다.

와일드 카드의 확장은 클래스 로딩 프로세스 자체에서 늦지 않고 프로그램의 주요 메소드를 호출하기 전에 조기에 수행됩니다. 와일드 카드를 포함하는 입력 클래스 경로의 각 요소는 이름 지정된 디렉토리에 JAR 파일을 열거하여 생성 된 요소의 (비어있는) 순서로 대체됩니다. 디렉토리가 예를 들어, foo포함 a.jar, b.jarc.jar다음 클래스 패스 foo/*로 확장 foo/a.jar;foo/b.jar;foo/c.jar, 그 캐릭터 라인은 시스템 프로퍼티의 값이 될 것이다 java.class.path.

CLASSPATH환경 변수에서 어떤 다르게 취급하지 않는 -classpath(또는 -cp) 명령 줄 옵션을 선택합니다. 즉,이 모든 경우에 와일드 카드가 사용됩니다. 그러나 클래스 경로 와일드 카드는 Class-Path jar-manifest헤더 에서 무시됩니다 .

참고 : Java 8의 알려진 버그로 인해 Windows 예제는 뒤에 별표가있는 백 슬래시 선행 항목을 사용해야합니다 : https://bugs.openjdk.java.net/browse/JDK-8131329


2
이 기능은 제대로 문서화되지 않았으며 의도 한대로 작동하려면 명백하지 않은 사전 조건이 충족되어야합니다.
Alex R

1
마지막 bash / tr 트릭에 +1 Java / JamVM은 작업 디렉토리 외부의 경로에 와일드 카드를 좋아하지 않지만 쉘 와일드 카드 + tr작동을 사용하여 각 JAR을 명시 적으로 참조 합니다!
Supr

1
java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass따옴표없이 명령이 있으며 정상적으로 작동합니다. 왜 쉘이 확장되지 않고 오류가 발생하는지 궁금합니다.
yellavon

3
~-cp에서도 사용하지 마십시오
Sohail Si

1
귀하의 Windows 예제는 Java 8 이전 버전에서는 작동하지 않지만 다음 클래스 경로에서는 다음과 같이 작동합니다. java.net/browse/JDK-8131329
philwalk

226

창에서 이것은 작동합니다 :

java -cp "Test.jar;lib/*" my.package.MainClass

그리고 이것은 작동하지 않습니다 :

java -cp "Test.jar;lib/*.jar" my.package.MainClass

* .jar을 확인 하여 * 와일드 카드를 단독으로 사용해야합니다 .


Linux에서는 다음이 작동합니다.

java -cp "Test.jar:lib/*" my.package.MainClass

구분 기호는 세미콜론 대신 콜론입니다.


17
완벽한 답변. 주의 사항이 개 중요한 사항 : 1)를 사용하여 시세 및 2) 사용 *뿐만 아니라 * .JAR
빔 Deblauwe

4
1 년 8 개월 후, UNIX 버전을 포함하도록 편집 한 내용이 다시 저장되었습니다. :) 재미 그것은 내 jar 파일을 인식하지 얼마나 *.jar만에 *.
jmort253

클래스 패스의 순서가 중요하다는 것을 알았습니다 (그러나 이유는 모르겠습니다). 클래스 경로 순서를 바꿀 때까지 오류가 발생했습니다.
user13107

@ jmort253, 문제는, 이것은 쉘이 아닌 * 확장이지만, 와일드 카드는 자바가 클래스 패스를 파싱하고 *를보고 와일드 카드를 채우는 것입니다
Sebastian

1
@SebastianGodelet-그래, 그냥 Regex 와일드 카드 와이 표기법 사이에 혼란스러워지고 있습니다. 대부분 저를 구한 것은 :한 플랫폼과 ;다른 플랫폼 의 차이점을 아는 것입니다 . :) 나는 일년에 한 번 정도 명령 줄에서 Java로 컴파일합니다. 얼마나 자주 성가신지를 기억하지 못합니다.
jmort253

67

이 문제 는 다른 필수 jar과 함께 클래스 경로를 지정하는 Manifest ( ) 파일 이 포함 된 기본 jar 파일 을 배치 한 후 함께 배치하여 해결합니다. 이 경우 코드를 실행할 때만 선언 하면됩니다.myapp.jarManifest.mfjava -jar myapp.jar

따라서 메인 jar을 일부 디렉토리에 배포 한 다음 종속 jar을 그 lib아래 의 폴더에 넣으면 매니페스트가 다음과 같습니다.

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

주의 : 이것은 플랫폼에 독립적입니다. UNIX 서버 나 Windows PC에서 동일한 jar을 사용하여 시작할 수 있습니다.


이것은 많은 사람들에게 효과적이지만 Java는 매니페스트 파일의 Class-Path 항목을 무시하는 것 같습니다. -cp를 사용하여 클래스 경로에 "lib / *"를 수동으로 추가하지 않으면 응용 프로그램을 실행할 수 없습니다. 어떤 아이디어?
Raku

6
oxbow_lakes의 답변이 완전히 정확하지는 않습니다. java -jar myapp.jar로이 jar을 시작하면 Class-Path 항목이 적용됩니다. 나는 oxbow_lakes가 그가 'java -classpath myapp.jar'을 썼을 때 그것을 쓰는 것을 의미한다고 가정합니다.
rzwitserloot

47

"lib"디렉토리에 모든 jar이있는 java-sun 1.6.0_24를 사용하는 Ubuntu 10.04에 대한 내 솔루션 :

java -cp. : lib / * my.main.Class

이것이 실패하면, 다음 명령이 작동해야합니다 (lib 디렉토리의 모든 * .jar를 classpath param에 인쇄합니다)

java -cp $ (lib / *. jar의 i의 경우 echo -n $ i :; 완료). my.main.Class

4
재미있는 메모. java -cp lib / * my.main.Class는 lib / *의 쉘 glob 확장으로 인해 항상 실패하지만 java -cp. : lib / * my.main.Class는. : lib / *가 유효한 glob가 아니기 때문에 실패합니다. 통로. 주의하십시오
albfan

1
이것은 작동하지 않습니다. 리눅스는 . java -cp '. : lib / '를 시도하면 잘 작동합니다 (작은 따옴표에 유의하십시오! 큰 따옴표에는 작동하지 않습니다!). 실제로. : lib / *는 콜론으로 인해 합법적 인 글로브가 아니지만 작동하는 경우 다소 불편합니다. 따옴표를 추가하겠습니다. 작은 따옴표는 bash에게 내용의 일부를 건드리지 말라고 지시합니다.
rzwitserloot

작은 따옴표 나 큰 따옴표를 사용하는 경우 (이 문맥에서) 중요하지 않습니다. 쉘이 *를 확장 (글 로빙)하는 것을 방지하고 싶습니다. 그리고 "lib / *"텍스트를 문자 그대로 JVM에 전달하므로 VM은이를 "특수 패턴"으로 인식하고 자체적으로 jar 파일을 검색합니다.
Angel O'Sphere

36

짧은 답변: java -classpath lib/*:. my.package.Program

Oracle은 클래스 경로 와일드 카드 이해 섹션 에서 Java 6Java 7의 클래스 경로에서 와일드 카드 사용에 대한 문서를 제공합니다 . (이 글을 쓸 때 두 페이지에 동일한 정보가 포함되어 있습니다.) 다음은 주요 내용을 요약 한 것입니다.

  • 일반적으로 지정된 디렉토리에 모든 JAR을 포함시키기 위해 와일드 카드 *( not *.jar )를 사용할 수 있습니다 .

  • 와일드 카드는 클래스 파일이 아닌 JAR에만 일치합니다. 디렉토리의 모든 클래스를 가져 오려면 디렉토리 이름에서 클래스 경로 항목을 종료하십시오.

  • 위의 두 옵션을 결합하여 디렉토리에 모든 JAR 및 클래스 파일을 포함시킬 수 있으며 일반적인 클래스 경로 우선 순위 규칙이 적용됩니다. 예 :-cp /classes;/jars/*

  • 와일드 카드는 하위 디렉토리에서 JAR을 검색 하지 않습니다 .

  • CLASSPATH시스템 속성 또는 -cp또는 -classpath명령 줄 플래그 를 사용하면 위의 글 머리 기호가 적용됩니다 . 그러나 Class-Path개미 빌드 파일에서와 같이 JAR 매니페스트 헤더 를 사용하면 와일드 카드가 적용 되지 않습니다 .

예, 첫 번째 링크는 최고 점수 답변에서 제공 한 것과 동일하지만 (오버 테이밍의 희망은 없습니다) 그 답변은 링크를 넘어서는 많은 설명을 제공하지 않습니다. 요즘 스택 오버플로에서는 이러한 종류의 동작이 권장되지 않으므로 확장 할 것이라고 생각했습니다.


내 문제는 lib / *가 아닌 lib / *. jar에 있습니다. 고마워이 문제를 해결했습니다. :과; 사이에 차이가 있음을 알았습니다. 그러나 그것은 내 테스트-같은 시간에 많은 변화가있을 수 있습니다.
Eyad Ebrahim

감사의 강조의 차이에 대한 *와 *의 .jar
burakhan alkan

36

윈도우 :

 java -cp file.jar;dir/* my.app.ClassName

리눅스 :

 java -cp file.jar:dir/* my.app.ClassName

알림 :
- 윈도우 경로 구분자는 ;
- 리눅스 경로 구분자는 :
-에서 윈도우 CP 인수가 공백을 포함하지 않는 경우, "따옴표"선택 사항입니다


Java 8 이하 버전에서는 Windows 예제가 작동하지 않습니다. bugs.openjdk.java.net/browse/JDK-8131329
philwalk

아마도 오픈 JDK에서는 작동하지 않을 것입니다. 이것을 테스트하고 여기서 이야기하겠습니다
Wender

죄송합니다, HotSpot으로 테스트했는데 openjdk에서 작동한다고 생각했습니다.
Wender

Windows에서 Oracle java는 가장 최근 또는 대체 Java 버전을 다시 테스트하지는 않았지만 슬래시가 아닌 별표 앞에 백 슬래시가 필요합니다.
philwalk

macos에서는 작동하지 않습니다
Greyshack


29

당신은 자바 http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html을 시도 할 수 있습니다-Djava.ext.dirs=jarDirectory

Java를 실행할 때 외부 jar의 디렉토리


3
이 작동하지만 조심, -Djava.ext.dirs=BEFORE를 통과-jar
Giovanni Funchal

5
java.ext.dirs는 클래스 경로의 일반 jar와 매우 다르게 작동합니다. bootstamp (rt.jar)의 클래스를 재정의 할 수있는 우선 순위와 권한이 더 높습니다
Dennis C

감사. 'java 버전 "1.8.0_221"Java (TM) SE 런타임 환경 (빌드 1.8.0_221-b27) Java HotSpot ™ 64 비트 서버 VM (빌드 25.221-b27, 혼합 모드)'에서이 -D 버전 만 클래스 패스를 전달하는 것이 효과가있었습니다. 전통적인 형태는 그렇지 않았습니다.
Matt Campbell

23

맞음 :

java -classpath "lib/*:." my.package.Program

잘못됨 :

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

9

모든 .jar 파일을 동적으로 지정해야하는 경우 쉘 스크립트 또는 Apache Ant를 사용할 수 있습니다 . Commons Launcher 라는 Commons 프로젝트가 있습니다 기본적으로 시작 스크립트를 개미 빌드 파일로 지정할 수 있습니다 (내가 무슨 뜻인지 알 경우).

그런 다음 다음과 같이 지정할 수 있습니다.

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

실행 빌드 파일에서 올바른 클래스 경로로 응용 프로그램을 시작합니다.



8

와일드 카드 확장은 Windows에서 Java 7에 대해 손상되었습니다.

이 StackOverflow 문제를 확인하십시오 자세한 내용은.

해결 방법은 와일드 카드 바로 뒤에 세미콜론을 넣는 것입니다. java -cp "somewhere/*;"


6

누가 관심을 가질 지

MSYS / MinGW 쉘에서 Windows에서이 이상한 동작을 발견했습니다.

공장:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

작동하지 않습니다 :

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

와일드 카드가 쉘에 의해 확장되지 않았 음을 확신합니다.

$ echo './*'
./*

(내장 된 것이 아니라 다른 프로그램으로도 echo같은 결과를 얻었습니다.)

나는 그것이 그것을 javac확장하려고하고 있다고 생각 하며, 논쟁에 세미콜론이 있는지 아닌지에 따라 다르게 행동합니다. 첫째, 경로처럼 보이는 모든 인수를 확장하려고 할 수 있습니다. 그런 다음에 -cp만 다음 토큰 만 가져 와서 구문 분석합니다 . ( com.comsol.aco_1.0.0.jar해당 디렉토리의 두 번째 JAR입니다.) 모두 추측입니다.

이것은

$ javac -version
javac 1.7.0

5

위의 모든 솔루션은 Eclipse 또는 Netbeans와 같은 IDE 외부에서 Java 응용 프로그램을 개발하고 실행하는 경우 효과적입니다.

Windows 7을 사용 중이고 Java에서 개발 용 Eclipse IDE를 사용한 경우 명령 프롬프트를 사용하여 Eclipse 내에 빌드 된 클래스 파일을 실행하면 문제가 발생할 수 있습니다.

예를 들어 Eclipse의 소스 코드에는 다음과 같은 패키지 계층이 있습니다. edu.sjsu.myapp.Main.java

Main.java의 외부 종속성으로 json.jar이 있습니다.

Eclipse 내에서 Main.java를 실행하려고하면 아무런 문제없이 실행됩니다.

그러나 Eclipse에서 Main.java를 컴파일 한 후 명령 프롬프트를 사용하여이 명령을 실행하면 "ClassNotDef Error blah blah"라는 이상한 오류가 발생합니다.

나는 당신이 소스 코드의 작업 디렉토리에 있다고 가정합니다!

다음 구문을 사용하여 명령 프롬프트에서 실행하십시오.

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [을 놓치지 마세요. 위]

Main.java를 edu.sjsu.myapp 패키지 안에 넣고 java.exe가 정확한 패턴을 찾기 때문입니다.

그것이 도움이되기를 바랍니다!


4

Windows의 경우 따옴표가 필요합니다. 구분 기호로 사용해야합니다. 예 :

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

짧은 형식 : 메인이 항아리 안에 있다면, 아마도 'YourJarsName.jar'가 클래스 경로에 있더라도 작동하도록하려면 추가 '-jar pathTo / yourJar / YourJarsName.jar'이 명시 적으로 선언되어 있어야합니다. , 5 년 전에 묻는 원래 질문에 대답하기 위해 표현되었습니다. 각 항아리를 명시 적으로 다시 선언 할 필요는 없지만 java6에서도 자신의 항아리를 다시 선언해야합니다 ...)


긴 형식 : (이것은 자바에 인터 로퍼조차도 이것을 사용할 수 있기를 바랍니다.)

여기에서 많은 사람들처럼 Eclipse를 사용하여 항아리를 내보내고 있습니다 (File-> Export-> 'Runnable JAR File'). '라이브러리 처리'이클립스 (Juno) 오퍼에는 세 가지 옵션이 있습니다.

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

일반적으로 opt2를 사용하고 (opt1은 확실히 깨짐) 사용하고있는 항아리 중 하나의 기본 코드는 옵션을 선택할 때 일식이 활용하는 편리한 "jarinjar"트릭으로 나누기를 발견했습니다. opt3이 필요하다는 것을 깨닫고이 StackOverflow 항목을 찾은 후에도 일식 밖에서 메인을 시작하는 방법을 알아내는 데 여전히 시간이 걸렸으므로 다른 사람들에게 유용하기 때문에 여기에 도움이 된 것이 있습니다 ...


jar의 이름을 "fooBarTheJarFile.jar"로 지정하고 모두 "/ theFully / qualifiedPath / toYourChosenDir"디렉토리로 내보내도록 설정되어 있습니다.

( '내보내기 대상'필드는 '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar'이라는 의미)

완료 후, eclipse를 찾은 다음 모든 라이브러리를 해당 내보내기 디렉토리 내의 'fooBarTheJarFile_lib'라는 폴더에 넣고 다음과 같은 것을 제공합니다.

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

그런 다음 다음을 사용하여 시스템의 어느 곳에서나 시작할 수 있습니다.

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(Java 초보자의 경우 : 'package.path_to.the_class_with.your_main'은 'main (String [] args)가 포함 된'TheClassWithYourMain.java '파일의 맨 위에있는 선언 된 패키지 경로입니다. {.. .} '는 자바 외부에서 실행하고 싶습니다.)


주의해야 할 함정은 선언 된 클래스 경로의 jar 목록에 'fooBarTheJarFile.jar'이 충분하지 않다는 것입니다. '-jar'을 명시 적으로 선언하고 해당 jar의 위치를 ​​다시 선언해야합니다.

예를 들면 다음과 같습니다.

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

상대 경로로 복원 :

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(자바 버전 12.04의 OpenJDK 64 비트 서버 VM을 통해 Java 버전 "1.6.0_27"사용)


3

내가 아는 유일한 방법은 예를 들어 개별적으로 수행하는 것입니다.

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

희망이 도움이됩니다!


이것은 08 년에 유일하게 돌아 왔을 수도 있지만 더 이상은 아닙니다.
simo.3792

이것은 최악이 아닙니다. 그것은 해킹이지만, 나는 내 bashrc에 이것을 설정했다for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

wepapp에서 수업 :

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

모두 별도로 추가해야합니다. 당신이 경우 또는, 정말 그냥 디렉토리를 지정해야합니다, 당신은 하나의 디렉토리에 압축 해제 모든 및 클래스 패스에 그것을 추가 할 수 있습니다. 그러나 클래스 경로 버전 관리 및 관리 불능의 기괴한 문제가 발생할 수 있으므로이 방법을 권장하지 않습니다.


3
이것은 08 년에 유일하게 돌아 왔을 수도 있지만 더 이상은 아닙니다.
simo.3792

2

/ *를 -cp로 설정할 수있는 직접적인 해결책은 아니지만 다음 스크립트를 사용하여 동적 클래스 경로 및 lib 디렉토리의 상황을 약간 완화 할 수 있기를 바랍니다.

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

Linux 용으로 스크립팅되었으므로 Windows 용으로도 비슷한 스크립트를 사용할 수 있습니다. "libDir2Scan4jars"에 입력으로 올바른 디렉토리가 제공되는 경우; 스크립트는 모든 jar을 스캔하고 클래스 경로 문자열을 작성하여 env 변수 "tmpCLASSPATH"로 내 보냅니다.


2

macOS, 현재 폴더

macOS Mojave의 Java 13의 경우 …

모든 .jar파일이 동일한 폴더에있는 경우 cd이를 사용하여 현재 작업 디렉토리 로 만드십시오 . 로 확인pwd .

위해 -classpath먼저 나열해야 JAR 파일 앱을. 콜론 문자 :를 분리 문자 로 사용하여 별표 *를 추가 하여 동일한 폴더 내의 다른 모든 JAR 파일을 가져 오십시오. 마지막으로 메소드 와 함께 클래스의 전체 패키지 이름을 전달하십시오.main .

예를 들어, 같은 폴더에 필요한 jar들과 함께 라는 패키지에 이름이 지정된 클래스 my_app.jarmain메소드로 이름 지정된 JAR 파일의 앱의 경우 :Appcom.example

java -classpath my_app.jar:* com.example.App

자바 8에서 작동하지 않습니다
Greyshack

1

jar 파일을 디렉토리 구조의 루트로 생각하십시오. 예, 모두 별도로 추가해야합니다.


1

여러 개의 jar 및 현재 디렉토리의 클래스 파일에 적합한 방식으로 클래스 경로를 설정하십시오.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

폴더에 여러 개의 항아리가 있습니다. 아래 명령 JDK1.8은 폴더에있는 모든 항아리를 포함시키는 데 도움이되었습니다. 클래스 경로에 공백이 있으면 따옴표로 묶으십시오.

윈도우

컴파일 : javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

달리는: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

리눅스

컴파일 : javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

달리는: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

Ubuntu에서 Java 파일을 jar 또는 클래스로 실행하려고합니다. 두 가지 옵션 모두에서 실패했습니다. 다음 예외는 출력입니다.

Download link: https://upload.cat/f694139f88c663b1

자바 org.statmetrics.Statmetric

또는

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

또는

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*"-jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

나는 답을 찾았다.

어리 석음

첫 번째 단계 : 해당 Java를 설정해야합니다. Java 11이 있지만 8 번째 버전으로 Java lib 경로로 설정했습니다! -여기에서 Java 버전을 설정할 수 있습니다.

  sudo update-alternatives --config java

두 번째 단계 : 그런 다음 경로 및 파일 이름을 해당 경로 및 파일로 변경하여 다음 명령을 실행하십시오.

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

성공적으로 실행되었습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.