2011-04-28 4 views
4

다른 JAR에서 같은 패키지로 두 클래스를 얻었다. 이전 버전이 나올 때까지 두 클래스 모두 동일하므로로드하는 데 문제가 없었습니다. 이제 그들 중 하나는 새로운 메소드가 추가되었습니다. 액세스하고자한다면 클래스를 그 패키지와 함께 가져와야 할뿐만 아니라 정확한 클래스를 가진 jar 파일이 classpath에 먼저 오도록해야합니다.다른 JAR에 두 클래스로드하기

javac -classpath "%classpath%;a.jar;b.jar" MyClasses..a.jar 나의 새로운 방법으로 클래스를 가지고

.

내 앱이 WEB-INF/lib 아래에있는 모든 라이브러리와 함께 EAR 파일로 배포되는 프로덕션 환경으로 이동하면 어떻게 보장 할 수 있습니까?

어떤 병이 다른 병보다 어떤 병을 선호하는지 어떻게 알 수 있습니까? a.jar에 b.jar보다 우선 순위가 부여 된 것과 같은 알파벳 순서입니까?

safe-class-imports-from-jar-files 스레드를 읽었으며 사용자 정의 클래스 로더 작성에 대해 알게되었지만 더 간단한 해결책이 있습니까? 이제이 현재 프로젝트의 전체 JAR에서이 메서드에 액세스하고 클래스 로더를 작성하는 것이 약간 잔인한 것처럼 보일뿐입니다.

그리고 "다른 JAR에서 같은 패키지로 같은 클래스를 사용하는 이유는 무엇입니까?" 그것은 나의 통제의 안에서 와 절대적으로있다. 그리고 이것을 바로 잡는 데 약간의 시간이 걸릴 것이다.

환경 세부 사항 : 1.5 Java에서 IBM WAS 6.1.

제가별로 의미가 없으면 더 궁금한 점이 있습니까? 미리 감사드립니다!

+0

모두들 대단히 감사합니다. 결국, 내가 말하기 싫은만큼, 누구나 제안 할 수있는 유일한 진정한 해결책은 중복을 제거하는 것입니다. 그 외에도 bootclasspath 또는 app 서버의 classpath에 jar 파일을 추가 할 수있는 옵션이 있지만 배포가 나에 의해 수행되지 않았기 때문에 해당 옵션이 실행 가능하지 않은 것처럼 보입니다. 나는 곧 대답을 받아 들일 것이다. 다시 한번 고마워. – asgs

답변

2

Websphere를 사용하면 클래스를 검색 할 때 특정 응용 프로그램의 클래스 로더 (클래스 로더가 계층 적으로 구조화되어 있으며, JRE 클래스를로드하는 최상위부터 WAR의 클래스 로딩 클래스까지)를 조회하는 순서를 지정할 수 있습니다.

앱을 배포하는 동안 클래스를 검색 할 때 클래스 로더를 질의하는 순서를 지정할 수 있습니다. 상위 모드 (상위 클래스 로더 먼저 쿼리)와 상위 모드 (먼저 앱 클래스 로더 쿼리)의 두 가지 모드가 있습니다. 이것은 EAR W WAR 레벨 모두에서 지정할 수 있습니다.

중복 된 jar를 앱의 다른 위치 (예 : EAR의 클래스 경로, 다른 하나는 WAR의 WEB-INF/lib)에 패키징하고 클래스 로더 순서를 적절히 설정하면 문제가 해결 될 수 있습니다. 그러나 두 JAR 파일이 같은 레벨 (예 : WEB-INF/lib)에 있어야하는 경우 중복 클래스를로드 할 때 사용할 JAR 파일을 지정할 방법이 없습니다.

+0

맞습니다. 둘 다 응용 프로그램 수준에 있습니다 : ( – asgs

+2

) EAR의 클래스 경로에 하나를 배치하거나 appserver의 ext 클래스 경로에 IMO를 배치하십시오. 다른 방법은 없습니다. –

+2

@asgs, 이것은 기본적으로 끔찍한 상황입니다. 유일한 "실제"해결책은 OSGi를 웹 응용 프로그램에 임베드하는 것과 같은 진정한 * 펑키 무언가를 할 수 없다면 종속성을 명확히하기 위해 항아리를 수정하는 것입니다. 문제가 없는지 확인하는 것이 효과적 일 수 있습니다. –

3

WEB-INF/lib에서로드되는 jars의 순서는 임의입니다 - JBOSS에 관해 비슷한 질문을했고 (RedHat의) 응답은 java.io.File.listFiles()이 반환하는 순서에 따라 달라집니다. (보장 된 명령이 아닙니다).

커스텀 클래스 로더는 옵션이 될 수 있지만, jar 파일을 다시 패키징하는 것을 고려 했습니까?

+0

@DaveHowes 감사하지만, 내가 말했듯이, 몇 가지 승인 단계를 거쳐야하므로 중복을 제거하는 데는 어느 정도 시간이 걸릴 것입니다. 또한 귀하의 질문에 대한 링크를 게시 할 수 있습니까? 도움이 될 수도 있습니다. – asgs

+2

http://stackoverflow.com/questions/5727703/jboss-ordering-of-contents-of-web-inf-lib – DaveH

+2

이것을 달성하기위한 해킹 방법은 앱 서버 클래스 경로에 "올바른"항아리를 넣는 것일 수 있습니다. "Parent First"클래스 로딩을 사용합니다. 그것은 허약 한 접근 일 것입니다. – DaveH

1

한 응용 프로그램에서 JAR의 순서는 알파벳 순서 일 가능성이 있지만 응용 프로그램 순서는 그렇지 않을 수 있습니다. 또한 서버가 클래스로드를 처리하는 방법, 즉 기존 클래스를 대체할지 또는 새 클래스를 건너 뛰는 지에 따라 다릅니다.

이미 말씀 드린대로 저는 여전히 충고하고 싶습니다. 하나의 응용 프로그램에 배포 된 여러 JAR에 동일한 클래스가 있으면 (예 : 버전이있는 jar로 발생할 수 있음) 항상 나쁜 생각입니다. 클래스 로딩을 혼란스럽게하는 대신에 시간을 투자하는 것이 더 나을 것입니다.

+0

"내 통제에서 절대적으로 벗어났다."... –

+0

@ Andreas 나는 그것을 읽었지만, 명시된 바와 같이, 나는 클래스 로딩으로 어지럽히는 것이 가치가 있다고 생각하지 않는다. 이는 정리 프로세스 (및 이와 관련된 승인)의 처리 속도를 높일 수 있습니다. - 편집 : asgs는 절대 수정할 수있는 방법이 없다고 말하지 않았습니다. 단지 시간이 걸릴 것 같습니다. – Thomas

3

서버의 시작 스크립트를 변경하고 java -Xbootclasspath을 사용하여 bootclasspath에 올바른 클래스로 jar를 지정할 수 있습니다. 그렇지 않으면 2 개의 병 중 어느 것이 먼저로드되는지 보장 할 수 없습니다.

1

이 꽤 모호 나올 수도 있지만 그 주어진 응용 프로그램에 대한 WAS 관리 콘솔과 장난과 자신의 웹 UI를 사용하여 관련 JAR 파일을 정리하여 다시이 문제에게 시간이 해결 기억 않습니다. 이 경우 귀하의 경우에는 받아 들일 수있는 단계이지만, 시도 가치가 모든 그렇지 않으면 실패합니다.

+0

WAS 관리 콘솔에서 사용할 수있는 클래스 로딩 모드 옵션을 말하는 것 같습니다. – asgs

1

배포에 대한 제어권이 있다고 가정하고 직접 클래스 로딩을 수정하십시오. 문제가있는 항아리를 같은 디렉토리에 역 적재 순서로 압축 해제 한 다음 새로운 항아리로 다시 압축하면됩니다. 그런 다음 새로운 콤보 항아리로 앱을 배포하십시오. 중복 클래스가 없으며 문제가 해결되었습니다.

또는 배포하기 전에 병에서 속임수 클래스를 삭제하면됩니다.

+0

ㅎ, 맞아.하지만 허락을 받아야한다면,이 일을 기꺼이 할 수있다. – asgs

+0

@jtalhborn, 나는 실제로 파일을 확인하고 배포를 기다리는 것을 제외하고는 모든 제어를하지 못했다. 행복하게하려면 :( – asgs