2014-03-13 3 views
6

Eclipse에서 Java 웹 응용 프로그램을 작성하고 Eclipse에서 실행되는 Tomcat 인스턴스에 배포하고 있습니다. 이 응용 프로그램이 JNDI Resource 요소를 통해 다른 호스트의 데이터베이스와 통신하도록하려고합니다. Eclipse : Tomcat의 JNDI 리소스 대체

의 context.xml 파일

은과 같이 로컬 호스트에서 실행중인 MySQL 서버에 연결하는 응용 프로그램의 시도에 포함 : 나는 실제 호스트에 설치하는 경우

<?xml version="1.0" encoding="UTF-8"?> 

<Context> 
    <Environment name="log4j.configuration" 
    value="/path/to/installed/log4j.properties" 
    type="java.lang.String" /> 

    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource" 
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3306/dbname" maxActive="8" 
    validationQuery="SELECT 1" testOnBorrow="true" /> 

    <Environment name="mykey" value="installed" type="java.lang.String" /> 

</Context> 

이 구성은 작동합니다. 즉, 환경 값을 올바르게 읽고 데이터베이스에 연결합니다.

또한 별도의 호스트에 설치 등등처럼 JDBC URL을 변경 /etc/tomcat6/conf/Catalina/localhost/myaplication.xml을 편집 할 수 있습니다

... 
    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource" 
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://otherhost:3306/dbname" maxActive="8" 
    validationQuery="SELECT 1" testOnBorrow="true" /> 
... 

이 구성은 또한 작동합니다. 즉, 내 응용 프로그램이 JNDI를 올바르게 사용하고 있다고 확신합니다.

이제 Eclipse의 바탕 화면에서 Tomcat에 배포하고 싶습니다. 나는 Tomcat에 표준 방식으로 프로젝트를 추가했고, 서버용 context.xml 파일 (예 : Eclipse가 Tomcat 서버의 "Servers"프로젝트에서 보여주는 것)을 다음과 같이 편집했습니다.

<?xml version="1.0" encoding="UTF-8"?> 

<Context> 
    <Environment name="log4j.configuration" 
    value=C:\workspace\myapplication\src\main\resources\conf\log_to_tomcat_console_log4j.properties" 
    type="java.lang.String" /> 

    <Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource" 
    username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://otherhost:3306/dbname" maxActive="8" 
    validationQuery="SELECT 1" testOnBorrow="true" /> 

    <Environment name="mykey" value="desktop" type="java.lang.String" /> 

</Context> 

Eclipse에서 Tomcat을 다시 시작하면 log4J 파일의 경로가 올바르게 읽혀지고 (Tomcat 콘솔에 로깅하기 시작하기 때문에) 로그에 올바른 "mykey"값이 누출되는 것을 볼 수 있습니다 . 그러나 configDB에서 읽으려고하면 초기화가 실패합니다.

처음에는이 문제가 연결 문제라고 생각했지만 디버거에서 Tomcat을 다시 시작하고 JNDI에서 읽은 DataSource를 검사했습니다. 그것의 URL은 localhost를 가리킨다. 즉, Tomcat의 것이 아니라 애플리케이션의 context.xml 파일에있는 URL을 사용하고있다.

이 정보를 Tomcat의 server.xml 파일에 저장하는 것을 포함하여 여러 가지 방법을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 더 정확하게 말하자면, 환경 값을 읽었으나 리소스가 아니기 때문에 일종의 작업입니다.

내가 뭘 잘못하고 있니? Eclipse의 Tomcat 서버에서이 자원을 대체하려면 어떻게합니까?

+0

이것은 매우 정교하게 만들어진 첫 번째 질문입니다. –

+0

감사! 장시간 청취자, 최초 발신자. – jpappe

+0

Eclipse에서 어떤 버전의 Tomcat을 사용하고 있습니까? 특히 6.0.x 또는 7.0.x? 이 영역에서 두 사람 사이의 행동은 다릅니다. –

답변

1

여기서 기본적인 문제는 이클립스에서 context.xml을 편집하면 바람둥이의 conf 디렉토리에있는 context.xml 주에 해당합니다. 그런 다음 응용 프로그램 컨텍스트 파일의 환경 설정이 우선합니다. Tomcat의 일반적인 배포 수명주기 내에서 이미 설명했듯이 응용 프로그램 설정을 편집하기 때문에 완벽하게 문제가되지 않습니다.

이클립스 (.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/Catalina/localhost 어딘가에 위치)에서 작성한 컨텍스트 파일을 사용하여 동일한 작업을 수행 할 수 있지만 원본 컨텍스트 파일 (META-INF/context.xml)을 변경하면 바로 덮어 씁니다. 실제로 변경 사항을 적용해야하지만이 파일은 사용자 지정 변경없이 배포해야하기 때문에 일반적으로 문제가되지 않습니다.

그러나 임시 해결 방법이 있습니다. eclipse는 전개 어셈블리를 악용하여 다른 META-INF/context.xml을 사용할 수 있습니다. 새 META-INF 디렉토리를 다른 곳에 만들고 context.xml 파일을 설정에 추가하십시오.그런 다음 이클립스 프로젝트의 프로젝트 속성에서 Deployment Assembly을 입력하면 새 path/to/META-INF에서 META-INF으로 추가 매핑이 추가됩니다.
그러면 이클립스가 원본 context.xml을 사용자 정의 된 설정으로 덮어 쓰고 바람둥이가 설정을 받아 들일 것입니다.

+0

이것은 일시적인 해결책이지만 약간 해킹입니다. 나는 이클립스의 Tomcat 통합이 개발에 사용할 수있는 지속적인 컨텍스트를 지원하지 않는다는 점에 놀랐다. – jpappe

+0

'Deployment Assembly'에 대해 좀 더 설명해 주시겠습니까? 이클립스 4.6.1 (Tomcat 8.5.6)의 프로젝트 속성에서'META-INF'에 대해서는 아무 것도 볼 수 없습니다. 내 관련 질문 http://stackoverflow.com/q/40556940/421049를 참조하십시오. –