programing

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

goodcopy 2022. 7. 5. 23:00
반응형

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

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

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

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 "$(printf %s: lib/*.jar)"

(클래스 패스를 사용하는 것은-jar선택.다음 항목도 참조하십시오.명령 프롬프트에서 여러 클래스 경로 라이브러리를 사용하여 jar 파일 실행)

와일드카드에 대해서

Classpath 문서에서:

클래스 경로 엔트리에는 기본 이름 와일드카드 문자를 포함할 수 있습니다.*이는 디렉토리 내의 모든 파일 목록을 확장자로 지정하는 것과 동등하다고 간주됩니다..jar또는.JAR예를 들어 클래스 경로 엔트리foo/*foo라는 이름의 디렉토리 내의 모든 JAR 파일을 지정합니다.단순하게 구성되는 클래스 패스 엔트리*현재 디렉토리의 모든 jar 파일 목록으로 확장됩니다.

다음을 포함하는 클래스 경로 항목*클래스 파일과 일치하지 않습니다.단일 디렉토리 foo에 있는 클래스와 JAR 파일을 모두 일치시키려면 다음 중 하나를 사용합니다.foo;foo/*또는foo/*;foo. 선택한 순서에 따라 의 클래스 및 리소스가 결정됩니다.fooJAR 파일보다 먼저 로드됩니다.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-manifestheader를 클릭합니다.

주의: Java 8의 기존 버그로 인해 Windows 예제에서는 뒷부분에 아스타리스크가 붙은 백슬래시 앞의 엔트리를 사용해야 합니다.https://bugs.openjdk.java.net/browse/JDK-8131329

Windows 에서는, 다음과 같이 동작합니다.

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

구분자는 세미콜론이 아닌 콜론입니다.

메인 jar 파일을 전개함으로써 이 문제를 회피할 수 있습니다.myapp.jar매니페스토를 포함한다.Manifest.mf클래스 패스를 지정하는 파일(다른 필수 jars와 함께 배치됩니다.이 경우 선언만 하면 됩니다.java -jar myapp.jar코드를 실행할 때 사용합니다.

그래서 만약 당신이 메인 시스템을jar어떤 디렉토리에, 그리고 의존적인 항아리를,lib그 아래의 폴더는 다음과 같습니다.

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

NB: 이것은 플랫폼에 의존하지 않습니다.유닉스 서버 또는 Windows PC에서 동일한 jar를 사용하여 실행할 수 있습니다.

Ubuntu 10.04의 솔루션은 "lib" 디렉토리에 모든 jars가 있는 java-sun 1.6.0_24를 사용합니다.

java - cp . : lib / * my . main 。학급

이 작업이 실패하면 다음 명령이 작동합니다(lib 디렉토리의 모든 *.jars를 classpath param으로 출력).

java - cp $(lib/*.jar의 i의 경우, 에코 -n $i:; 완료).my.main.학급

간단한 답변:java -classpath lib/*:. my.package.Program

Oracle은 클래스 경로에서 와일드카드를 사용하는 방법에 대한 문서를 Java 6 및 Java 7의 경우 "클래스 경로 와일드카드 이해" 섹션 아래에 제공합니다(이 문서를 작성할 때 두 페이지에 동일한 정보가 포함되어 있습니다).주요 내용은 다음과 같습니다.

  • 일반적으로 지정된 디렉토리에 모든 JAR을 포함하려면 와일드카드를 사용합니다.*(없음) *.jar).

  • 와일드카드는 클래스 파일이 아닌 JAR에만 일치합니다.디렉토리 내의 모든 클래스를 가져오려면 디렉토리 이름으로 클래스 경로 엔트리를 종료합니다.

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

  • 와일드카드는 서브디렉토리의 JAR 를 검색하지 않습니다.

  • 위의 글머리 기호 포인트는 다음과 같습니다.CLASSPATH시스템 속성 또는-cp또는-classpath명령줄 플래그단,Class-PathJAR 매니페스트 헤더(개미 빌드 파일처럼)는 와일드카드는 허용되지 않습니다.

네, 제 첫 번째 링크는 가장 높은 점수를 받은 답변에 나와 있는 링크와 동일하지만(추월할 가망은 없습니다) 링크 이외의 설명은 별로 없습니다.요즘 Stack Overflow에서는 그런 동작이 권장되지 않기 때문에 확장하려고 합니다.

Windows:

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

Linux:

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

알림:
- Windows 경로 구분자는;
- Linux 경로 구분자는:
- Windows에서 cp 인수에 공백이 없는 경우 "quotes"는 옵션입니다.

나에게 이것은 창문에서 작동한다.

java -cp "/lib/*;" sample

Linux의 경우

java -cp "/lib/*:" sample

자바6를 사용하고 있습니다.

java 사용 가능-Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

Java 실행 시 외부 jar 디렉토리

정답:

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

Java 6을 사용하는 경우 클래스 경로에서 와일드카드를 사용할 수 있습니다.

이제 클래스 경로 정의에서 와일드카드를 사용할 수 있습니다.

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes

참고 자료: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/

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

다음에, 다음과 같이 지정할 수 있습니다.

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

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

Windows 의 Java 7 에서는 와일드카드 확장이 무효가 되어 있습니다.

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

회피책은 와일드카드 바로 뒤에 세미콜론을 붙이는 것입니다. java -cp "somewhere/*;"

관련되시는 분께,

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

Wildcard는 셸에 의해 확장되지 않는다고 확신합니다.

$ echo './*'
./*

(내장 프로그램이 아닌 다른 프로그램에서도 시험해 보았습니다).echo, 같은 결과가 됩니다.)

제 생각에는javac인수에 세미콜론이 있는지 여부에 관계없이 다르게 동작합니다.우선 경로처럼 보이는 인수를 모두 확장하려고 할 수 있습니다.그런 다음에야 그걸 해석해서-cp다음 토큰만 받습니다.(주의:com.comsol.aco_1.0.0.jar는, 그 디렉토리내의 2번째의 JAR 입니다).그건 모두 추측이다.

이것은

$ javac -version
javac 1.7.0

위의 모든 솔루션은 Eclipse 또는 Netbeans와 같은 IDE 외부에서 Java 애플리케이션을 개발하고 실행하는 경우 매우 효과적입니다.

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

예: Eclipse의 소스 코드에는 edu.sju.myapp 패키지 계층이 있습니다.Main.java

Main.java의 외부 의존관계로서 json.jar가 있습니다.

이클립스 내에서 Main.java를 실행하려고 하면 문제없이 실행됩니다.

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

소스코드의 작업 디렉토리에 있는 것 같습니다!!

명령 프롬프트에서 실행하려면 다음 구문을 사용합니다.

  1. javac - cp "arantjson.jar" Main.java

  2. java - cp "arantjson . jar " edu . su . myapp .주된

    [위 내용 놓치지 마세요]

이는 패키지 edu.sjsu.myapp에 Main.java를 넣었기 때문입니다.java.exe는 정확한 패턴을 찾습니다.

도움이 되었으면 좋겠다!!

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

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

간단한 형식: 메인 파일이 항아리 안에 있는 경우 추가 '-jar 경로 To/yourJar/YourJarsName'이 필요할 수 있습니다.jar'는 ('YourJarsName.jar'가 클래스 패스에 있었지만) 명시적으로 동작시키겠다고 선언했습니다.(또는 5년 전에 질문된 원래의 질문에 답하기 위해 표현된 것입니다.각 jar를 명시적으로 재클래어할 필요는 없지만 java6를 사용하더라도 자신의 jar를 재클래어할 필요가 있는 것 같습니다.)


긴 폼: (자바의 인터로퍼도 이것을 이용할 수 있으면 좋겠다고 생각할 정도로 명료하게 설명했습니다.

여기 있는 많은 사람들과 마찬가지로 이클립스를 사용하여 jar를 내보내고 있습니다. (파일 -> 내보내기 --> 실행 가능한 JAR 파일')'라이브러리 핸들링' 이클립스(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 엔트리를 찾은 후에도 일식 이외의 메인 기동 방법을 알아내는 데 시간이 걸렸습니다.이것이 다른 사람에게 도움이 됩니다.


병에 이름을 붙인 경우: "fooBar"JarFile.jar" 및 모두 dir: "/theFully/qualifiedPath/toYourChosenDir" 에 내보내도록 설정되어 있습니다.

(「export destination(내보내기처)」필드는, 「/theFully/qualifiedPath/toYourChosenDir/fooBar」라고 표시됩니다).The JarFile.jar' )

마침을 누르면 이클립스가 표시되고 모든 라이브러리가 'fooBar'라는 폴더에 저장됩니다.내보내기 디렉토리 내의 JarFile_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 Newbies의 경우: '패키지'.path_to.t_class_with.your_main'은 TheClass 상단에 있는 선언된 패키지 경로입니다.With YourMain.java' 파일에는 'main(String[] args'{...}' 외부 Java에서 실행하려는 경우)


주목해야 할 함정은 'fooBar'가선언된 클래스 경로의 jar 목록 내 JarFile.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   

(java 버전 1.6.0_27 사용, ubuntu 12.04의 OpenJDK 64비트 서버 VM 사용)

macOS, 현재 폴더

MacOS Mojave에서 Java 13을 사용하는 경우...

만약 당신의 모든 것이.jar파일이 같은 폴더에 있습니다.이를 사용하여 현재 작업 디렉토리를 만듭니다.로 확인합니다.

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

예를 들어 JAR 파일 내의 어플리케이션의 경우my_app.jar와 함께main클래스 내의 메서드App라고 하는 패키지로com.example, 같은 폴더에 필요한 몇개의 항아리와 함께:

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

모두 따로따로 추가해야 합니다.또는 디렉토리를 지정할 필요가 있는 경우는, 모든 것을 1개의 디르로 해동해 클래스 패스에 추가할 수도 있습니다.그러나 클래스 패스 버전화와 비인기성의 기괴한 문제가 발생할 위험이 있으므로 이 접근방식은 권장하지 않습니다.

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

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

도움이 됐으면 좋겠네요!

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

jar 파일을 디렉토리 구조의 루트로 생각해 주세요.네, 따로따로 추가해야 합니다.

/*를 -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"로 내보냅니다.

여러 개의 jars 및 현재 디렉토리의 클래스 파일에 적합한 방법으로 클래스 경로를 설정합니다.

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

나는 폴더에 여러 개의 항아리가 있다.다음 명령어가 나에게 효과가 있었다.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

인수 순서java명령도 중요합니다.

c:\projects\CloudMirror>java Javaside -cp "jna-5.6.0.jar;.\"
Error: Unable to initialize main class Javaside
Caused by: java.lang.NoClassDefFoundError: com/sun/jna/Callback

c:\projects\CloudMirror>java -cp "jna-5.6.0.jar;.\" Javaside
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable

언급URL : https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory-within-the-java-classpath

반응형