2012-06-28 3 views
5

우리는 쉘 스크립트에서 클래스 패스, 경로 등을 언급하는 커맨드 스크립트가있는 독립형 자바 프로그램을 실행하고 있습니다.이 공통 스크립트에서 지금 우리는 몇 개의 클래스 패스를 추가했으며 문자의 수는 9000 개를 넘었습니다. 테스트 환경에서 올바르게 작동합니다. 프로덕션에서 문제가 발생합니까? 어떤 제한 사항이 리눅스에서 classpath를 설정합니까? 명령 행 입력에 대한 최대 문자는 무엇입니까 ...리눅스에서 클래스 패스 제한

+1

오류가 발생했습니다. 테스트 환경에서는 동일한 작업을 수행하기 전에 모든 것이 올바르게 작동하는지 확인합니다. 테스트 환경을 신뢰할 수 없다면 왜 테스트 환경을 가지고 있습니까? –

+2

환경 변수의 길이에 제한이 있으며 명령 줄의 길이에 제한이 있습니다. 당신은 * 그 종류의 길이를 가진 이들 모두에게 접근 할 수 있습니다 (난로로 모든 OS에 대한 구체적인 숫자를 알지 못합니다). [classpath 와일드 카드] (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)를 사용하여 시작할 수 있습니다. –

+1

@JB : 이론적으로 테스트 환경과 프로덕션 환경은 동일해야하며 이론적으로는 테스트 환경에서 작동한다면 이론적으로는 생산 환경에서 작동합니다. 그러나 이론과 실습의 차이점은 이론적으로 이론과 실습간에 차이가 없다는 것입니다. –

답변

0

최대 Linux 명령 행 길이에 대해서는 this stackoverflow answer을 참조하십시오.

최대 명령 줄 길이는 대략 128KB에서 2MB 사이입니다.

하나의 인수의 최대 크기는 상당히 작지만 9000 개의 문자는 문제가 될 수 있습니다. 당신이 당신의 자바 프로그램에서 사용하는 경우

0

classpath 변수에 지정된 jar 파일의 일부 클래스는 JVM는 실행중인 프로그램이 명시 적으로 클래스가 필요합니다 때까지 클래스를로드 (또는 경우하지 않습니다 코드에서 클래스를 명시 적으로로드 - 동일한 아이디어). classpath이 매우 길 때만 나타날 수있는 유일한 문제는 classpath 확인 전에 JVM이 올바른 jar 파일을 찾는데 필요한 시간입니다. 그러나 그것은 문제가되어서는 안됩니다. 프로그램이 테스트에서 잘 작동한다면, 걱정할 필요가 없습니다.

4

아니요, 제한이 없습니다. Windows에는 (8191 자) 있지만 Linux에서는 그렇지 않습니다. 우리는 classpath-files의 개념을 가지고 작업한다. 이 파일에는 응용 프로그램에 대한 모든 종속 예 :

... 
libs/org/easymock/easymock/2.2/easymock-2.2.jar 
libs/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar 
libs/org/hibernate/hibernate-envers/4.1.0.Final/hibernate-envers-4.1.0.Final.jar 
libs/com/google/inject/guice/3.0/guice-3.0.jar 
... 

하고 우리는 가능한 클래스 경로에이 변환하고 다음과 같이 응용 프로그램을 실행 : 우리는 문제와이 클래스 경로로 실행 적이없는

#!/bin/bash 

CLASSPATH_FILE=`ls -r1 ${APP-HOME}/classpaths/myapp*.classpath | head -n1` 
CLASSPATH=$(cat $CLASSPATH_FILE | sed 's_^libs_ ${APP-HOME}/libs_' | tr -d '\n' | tr -d '\r' | sed 's_.jar/libs/_.jar:/libs/_g' | sed 's_.pom/libs/_.pom:/libs/_g') 

java -d64 -cp $CLASSPATH com.blah.main.Main [email protected] 

항목이 상당히 커집니다.

EDIT : maven dependency plugin을 사용하여 종속성 목록을 생성 할 수 있습니다.

+3

나는 Linux에는 제한이 없다고 동의한다. 구형 커널 (2.6.5)에서는 명령 행 길이에 대해 128KB의 하드 한계를 맞았습니다. – QuantumMechanic

+0

... 리눅스는 절대로 나를 놀라게하지 않습니다. OK, correct then : 실제 운영 체제가 문제를 일으키지 않아야합니다. :-) (필자는 위의 필수 변경 사항을 만들었습니다. 감사합니다 QuantumMechanic) –