2014-11-10 1 views
1

웹 모듈 (myWeb.war)과 EJB 모듈 (myModel.jar)이라는 두 개의 모듈이있는 웹 응용 프로그램의 EAR (myApp.ear)이 있습니다. 이제 같은 패키지 myPackage에있는 두 모듈 모두에있는 클래스 myDuplicate.class이 있습니다. 클래스의 구현은 두 모듈에서 모두 다릅니다.응용 프로그램의 두 모듈에있는 중복 클래스 - 인스턴스화 클래스에서 참조 할 수 있습니까?

웹 모듈의 클래스가 myDuplicate 클래스의 객체를 만드는 경우 객체의 크기는 myWeb이거나 myModel 인 것입니다.

이 작업은 서버의 클래스로드 메커니즘에 달려 있습니까? 그렇다면이 클래스 로딩을 제어하기 위해 OC4J 서버 구성에 매개 변수가 있습니까? 그렇지 않다면 무엇이 그것을 통제합니까?


위의 내용은 너무 일반적인 것 같지만 실제로 직면하고있는 실용적인 문제입니다. 다른 환경에서 다른 클래스가로드되고 있지만 그것을 제어 할 수없는 것을 알 수 없습니다. 나는 검색을 시도하고 답변이 될 수도있는 클래스 로더에게 왔습니다. 그러나 그 후에도 두 환경 모두에서 일관된 방식으로 동작하도록 제어하는 ​​방법을 찾을 수 없었습니다.

명확하지 않은 내용이 있으면 공유하지 말고 명확히하려고 노력하겠습니다.

+3

FQN이 동일 할 경우에만 중복됩니다. 그럴 경우 JVM은 클래스 로더에서 발생한 첫 번째 로딩을로드합니다. 이는 클래스 로더가 디스크에서 어떻게 찾았는지 배후의 특성에 달려 있다고 생각합니다. 이 링크는 클래스 로더가 클래스 경로에서 엔티티를 평가하는 방법을 알려줍니다 (기본 클래스 로더를 사용하고 있다고 가정). https://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html –

+0

@ MarkW 패키지와 클래스 이름이 같습니다. 네, FQN은 같습니다. 나는 클래스 로더를 사용하지 않고 있지만, 앱 서버는 제어 할 수 없다. BTW 클래스의 선택에 영향을 미칠 수있는 클래스 로딩 외에 무엇이 있습니까? –

+0

그 사실을 알고 있지는 않지만 테스트 할 수있는 것은 확실합니다. 중복 클래스가 포함 된 종속성이 앱의 ClassPath JVM arg에 같은 순서로 나타나는지 확인하는 것입니다. 나는 ear 파일로 어떻게 작동하는지 알지 못한다. 그러나 클래스 패스가 같으면 (클래스 파일의 요소의 순서를 의미하는), 같은 클래스를 같은 방식으로 다른 애플 리케이션에로드해야하며, 그것의 사본에 상대적으로 목록에서 처음으로 넣어 사용되는 제어 할 수 있습니다. –

답변

2

Java EE 호환 응용 프로그램 서버의 클래스 가시성에 대한 명확한 규칙이 있습니다.

  • 각 웹 모듈의 내용으로 구성되어 다음과 같이

    는 요약 (및 매니페스트 클래스 경로 항목, 외부 라이브러리 또는 RAR 파일이없는 경우), EAR 파일에 모듈 정의 WEB-INF/classes와 WEB-INF/lib 디렉토리의 모든 jar 파일

  • 각 ejb 모듈은 독립형입니다.
  • EAR/lib 디렉토리의 내용은 클래스 가시성을위한 단일 모듈로 간주됩니다.

    • 웹 모듈이 분리되어 서로의 클래스를 참조 할 수 없지만 EAR/lib에 클래스를 볼 수 있습니다

  • 위를 감안할 때. 그들은 종종 ejb 모듈을 볼 수 있지만 이것이 필수 사항은 아닙니다. 호환 응용 프로그램은이를 해결하기 위해 매니페스트 Class-Path 항목을 사용합니다.
  • ejb 모듈은 고유 한 클라이언트 jar 클래스와 EAR/lib 클래스를 볼 수 있습니다. 그들은 종종 다른 ejb 모듈도 볼 수 있지만 이것이 필수 사항은 아닙니다. 호환 응용 프로그램은이를 해결하기 위해 매니페스트 Class-Path 항목을 사용합니다. EAR에/lib 디렉토리에
  • 항아리는

그래서, 희망이 당신에게 서로 다른 구성 요소 사이의 클래스 가시성의 명확한 아이디어를 제공 서로의 클래스를 볼 수 있습니다.

  • 웹 모듈의 자신의 클래스를 항상 다른 클래스 로더에보고하기 전에 사용됩니다 그러나 여전히 클래스 로딩 순서의 명확한 그림이 필요합니다.
  • "상위 우선"클래스 로딩이 다른 모든 곳에 적용됩니다.

특정 경우에 myDuplicatemyWeb이 생성됩니다. myDuplicate의 인스턴스를 myModel으로 전달하지 않으려면 괜찮습니다. 클래스 로딩 문제가 발생할 수 있습니다.

개발자가 log4j (또는 다른 로깅 라이브러리)를 EAR 파일과 해당 웹 모듈에 번들로 묶어서 많은 클래스 로딩 문제가 발생하는 경우에 이런 종류의 문제가 자주 발생합니다.

자세한 내용은 §EE.8.2 Library SupportJava™ Platform, Enterprise Edition (Java EE) Specification, v6을 참조하십시오.

+0

이것은 많은 것을 명확하게합니다. 그러나이 설명이 설명하지 못하는 하나의 관찰이있다. 제가 질문하는 웹 애플리케이션은'struts-1' 애플리케이션입니다. 하나의'ActionForm' 클래스가 웹 모듈과 EJB 모듈 모두에 존재했습니다. 나는 이것이 그것이 EAR에서의 문제라는 것을 알고있다. 한 서버에서 AF는 JAR에서로드되고 WAR에서는로드되지 않습니다. 로깅을 통해 확인했습니다. 어떻게 된거 야? 또한'호환 응용 프로그램 '을 작성합니다. 나는 그것이 불평 할 필요가있는 서버라는 인상 아래에 있었다. 설명 할 수 있니? –

+0

'호환 애플리케이션 '(vs'호환 애플리케이션 서버')의 맥락에서 [매니페스트 클래스 경로 항목] (https://docs.oracle.com/javase/tutorial/deployment/jar/)을 제공해야하는 애플리케이션입니다. downman.html) where –

+0

OC4J 서버에 대해 언급 한 중복 'ActionForm' 작동과 관련된 사항은 무엇입니까? –

0

oracle-OC4J에서 중복 정의를 해결하려면 이러한 구성을 orion-application.xml 또는 orion-web.xml에 추가 할 수 있습니다.

1) WEB-INF/오리온-web.xml 파일의 설정 : WEB-INF 예상 항아리를 추가/lib 디렉토리 또는 pom.xml 파일 (제공되지 않음) :

<orion-web-app ...> 
    <web-app-class-loader search-local-classes-first="true" /> 
</orion-web-app> 

2) META-INF/orion- application.xml을 :

<orion-application ...> 
    <imported-shared-libraries> 
    <remove-inherited name="name.of.your.lib"/> 
    </imported-shared-libraries> 
</orion-application> 

3) .WAR 파일에이 파일/수정 팩 및 OC4J에 배포 : 중복 LIB 이름으로 (로그 메시지를 보여 주었다), 당신의 연결 설정을 제거합니다.

관련 문제