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.jar및 c.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 6 및 Java 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.jar의 main메소드로 이름 지정된 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.