문제

클래스 경로에 비정상적으로 많은 수의 요소가있는 Windows XP 명령 줄에서 특정 Junit 테스트를 직접 실행하려고합니다. 다음과 같은 몇 가지 변형을 시도했습니다.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\java.exe -client oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(다른 변형은 클래스 경로를 한 줄로 설정하여 -classpath를 통해 클래스 경로를 Java에 대한 인수로 설정합니다.

The input line is too long.
The syntax of the command is incorrect.

이것은 기존 레거시 프로젝트를 다소 대규모로 테스트하는 주니트 테스트이므로 디렉토리 구조를보다 합리적인 것으로 재 배열하는 것에 대한 제안은 없습니다. 나는이 프로젝트에 대한 빠른 테스트를 시작하고 명령 줄에서 실행하려고했는데 콘솔이 저를 방해하고 있습니다. 돕다!

도움이 되었습니까?

해결책

이와 관련하여 Windows 명령 줄은 매우 제한적입니다. 해결 방법은 "Pathing Jar"를 만드는 것입니다. 이것은 a 만 포함하는 항아리입니다 Manifest.mf 누가 파일 Class-Path 긴 항아리 목록의 디스크 경로를 지정합니다. 이제 추가하십시오. 통로 항아리 당신의 명령 줄 classpath에. 이것은 일반적으로 실제 자원을 함께 포장하는 것보다 더 편리합니다.

내가 기억 하듯이, 디스크 경로는 통로 항아리 그 자체. 그래서 Manifest.mf 다음과 같이 보일 수 있습니다.

Class-Path: this.jar that.jar ../lib/other.jar

당신의 경우 통로 항아리 주로 기초 자원이 포함되어 있으면 너무 자주 변경되지는 않지만 여전히 빌드 어딘가에 생성하고 싶을 것입니다. 예를 들어:

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>

다른 팁

Java 6이므로 사용할 수 있습니다 클래스 스 패스 와일드 카드.

예시: foo/*, 디렉토리의 모든 .jar 파일을 나타냅니다 foo

  • 클래스 파일 (JAR 파일 만)과 일치하지 않습니다. 두 사용과 일치합니다. foo;foo/* 또는 foo/*;foo. 순서는 먼저로드 된 내용을 결정합니다.
  • 검색은 재귀가 아닙니다

Java 9+에서 "인수 파일"을 사용하십시오

Java 9+에서 Java 실행 파일은 파일을 통해 인수를 제공합니다. 보다https://docs.oracle.com/javase/9/tools/java.htm#jswor-guid-4856361b-8bfd-4964-ae84-121f5f6cf111.

이 메커니즘은 명령 길이에 대한 OS 제한 문제를 해결하기위한 것입니다.

@argument 파일을 사용하여 옵션 및 클래스 이름과 같은 인수가 포함 된 텍스트 파일을 Java 명령에 전달하여 Java 명령을 단순화하거나 단순화 할 수 있습니다. 이를 통해 모든 운영 체제에서 모든 길이의 Java 명령을 작성하겠습니다.

명령 줄에서 AT 부호 (@) 접두사를 사용하여 Java 옵션 및 클래스 이름이 포함 된 인수 파일을 식별하십시오. Java 명령이 AT 부호 (@)로 시작하는 파일을 만나면 명령 줄에 지정된 것처럼 해당 파일의 내용을 인수 목록으로 확장합니다.

버전 9 이상을 실행중인 경우 "올바른"솔루션입니다. 이 메커니즘은 단순히 인수가 JVM에 어떻게 제공되는지를 수정하고 따라서 모든 프레임 워크 또는 응용 프로그램과 100% 호환됩니다., 그들이 클래스로드하는 방법에 관계없이, 그것은 평소와 같이 명령 줄에 인수를 제공하는 것과 완전히 같습니다. 이 OS 제한에 대한 Manifest 기반 해결 방법에는 해당되지 않습니다.

이것의 예는 다음과 같습니다.

원래 명령 :

java -cp c:\foo\bar.jar;c:\foo\baz.jar

다음과 같이 다시 작성할 수 있습니다.

java @c:\path\to\cparg

어디 c:\path\to\cparg 다음을 포함하는 파일입니다.

-cp c:\foo\bar.jar;c:\foo\baz.jar

이 "인수 파일"은 또한 라인 연속 문자를 지원하고 경로에서 공간을 올바르게 처리하는 것을 인용합니다.

-cp "\
c:\foo\bar.jar;\
c:\foo\baz.jar"

gradle

Gradle 에서이 문제를 발견하는 경우이 플러그인을 참조하여 클래스 경로를 "인수 파일"으로 자동 변환하고 Windows에서 EXEC 또는 테스트 작업을 수행 할 때 JVM에이를 제공합니다. Linux 또는 기타 운영 체제에서는 기본적으로 아무것도하지 않지만 OS에 관계없이 변환을 적용하는 데 선택적 구성 값을 사용할 수 있습니다.

https://github.com/redocksoft/classpath-to-file-gradle-plugin

(면책 조항 : 나는 저자입니다)

이 관련 Gradle 문제도 참조하십시오.이 기능은 결국 Gradle Core에 통합되기를 바랍니다. https://github.com/gradle/gradle/issues/1989.

(나는 당신이 실제로 DOS를 의미하지는 않지만 cmd.exe를 참조하십시오.)

환경 크기/환경 변수 크기 제한보다 클래스 경로 제한이 적다고 생각합니다. XP에서는 개별 환경 변수의 크기가 8K 일 수 있으며 전체 환경의 크기는 64K로 제한됩니다. 나는 당신이 그 한계에 도달 할 것임을 알 수 없습니다.

Windows에는 명령 줄의 길이를 제한하는 Windows의 한계가 있습니다. Windowsnt+는 CMD.Exe의 경우 8K입니다. 세트 명령은 해당 제한을받습니다. 세트 명령에 8K 이상의 디렉토리가있을 수 있습니까? 당신은 운이 좋지 않을 수 있습니다. Nick Berardi 제안.

내가 당신의 신발에 있으면 MS에서 정션 유틸리티를 다운로드 할 것입니다. http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx 그런 다음 "z : "및 "c : path2"라고 말하면 "c : path"를 매핑하여 "y : "라고 말합니다. 이런 식으로, 당신은 당신의 항목 당 4자를 줄일 것입니다. classpath.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

이제 당신의 클래스 경로는 다음과 같습니다.

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

실제에 따라 더 많이 할 수 있습니다 classpath.

나는 당신이 여기에 외륜이없는 개울 위에 있다고 생각합니다. CommandLine은 인수가 프로그램을 호출 할 제한이 있습니다.

나는 당신이 시도 할 수있는 2 개의 sugestion을 가지고 있습니다. 먼저, 주니트 테스트를 실행하기 전에 스크립트/ant_task가 클래스 경로에서 다양한 클래스의 항아리를 만들 수 있습니다. 그런 다음 항아리를 클래스 스팟에 놓을 수 있습니다.

당신이 시도 할 수있는 또 다른 방법은 Junit을 실행하기 위해 개미 스크립트를 만드는 것입니다. Ant에는 Classpath 항목에 대한 제한이 없어야합니다.

Huibertgill이 언급했듯이, 나는 이것을 직접 관리 할 필요가 없도록 ANT 빌드 스크립트로 이것을 감싸고 있습니다.

당신은 이것을 시도 할 수 있습니다


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

명령 프롬프트로 가서 두 번 실행하십시오 (왜 그런지 모르겠습니다 .... Windows XP 시스템에서 그렇게해야합니다) 또한 현재 명령 프롬프트 세션에 대해서만 설정된 경로 r

JAR 파일을 "c : jars"와 같은 폴더로 옮겨서 클래스 경로를 더 짧게 만드는 것 외에는 문제에 대한 해결책이 없었습니다.

감사합니다 라만 Java 9+의 경로 문제에 대한 새로운 솔루션을 도입합니다. 나는 해킹을했다 bootRun Gradle이 이미 평가 한 모든 것을 사용하여 인수 파일로 Java를 실행할 수있는 작업. 그다지 우아하지는 않지만 작동합니다.

// Fix long path problem on Windows by utilizing java Command-Line Argument Files 
// https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 
// The task creates the command-line argument file with classpath
// Then we specify the args parameter with path to command-line argument file and main class
// Then we clear classpath and main parameters
// As arguments are applied after applying classpath and main class last step 
// is done to cheat gradle plugin: we will skip classpath and main and manually
// apply them through args
// Hopefully at some point gradle will do this automatically 
// https://github.com/gradle/gradle/issues/1989 

if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    bootRun {
        doFirst {
            def argumentFilePath = "build/javaArguments.txt"
            def argumentFile = project.file(argumentFilePath)
            def writer = argumentFile.newPrintWriter()
            writer.print('-cp ')
            writer.println(classpath.join(';'))
            writer.close()

            args = ["@${argumentFile.absolutePath}", main]
            classpath = project.files()
            main = ''
        }
    }
}

쌓아 보셨나요?

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top