Tomcat 7.0에서 웹 애플리케이션의 컨텍스트 경로를 설정하는 방법


162

내 webapp (또는 WAR 파일)의 이름을 ROOT로 바꿀 수 있지만 IMHO는 끔찍한 방법입니다. 이제 바람둥이 문서를 확인했는데

server.xml 파일에 직접 요소를 배치하지 않는 것이 좋습니다.

그래서 제안한 다른 방법으로 시도했습니다.

개별 컨텍스트 요소는 다음과 같이 명시 적으로 정의 될 수 있습니다. 응용 프로그램 파일 내의 /META-INF/context.xml에있는 개별 파일.

그래서 /META-INF/context.xml다음 코드를 사용하여

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/"/>

그러나 서버를 다시 시작할 때 배포 한 후에도 여전히 "/"에서 컨텍스트를로드하지 못했습니다. "/<WEB_APP_NAME>"

도움이되는 포인터.



1
다음 문장에서 "doc.xml 파일에 요소를 직접 배치하지 않는 것이 좋습니다"라는 이유는 다음 문장에서 설명합니다. Tomcat을 다시 시작하지 않고 다시로드 할 수 있습니다. " 아래의 대답은 직접 문제를 해결하지만이 경로를 다시 수정할 가능성이 없거나 재시작이 너무 지장을주지 않으면 server.xml을 수정하는 것이 그다지 부적절하지 않은 것 같습니다.
rimsky

답변:


236

할 수있는 일은 다음과 같습니다.

호출 ROOT.xml된 파일 추가<catalina_home>/conf/Catalina/localhost/

이 ROOT.xml은 해당 엔진 및 호스트 (Catalina 및 localhost)에 대한 Tomcat 설치의 루트 컨텍스트에 대한 기본 설정을 대체합니다.

ROOT.xml 파일에 다음을 입력하십시오.

<Context 
  docBase="<yourApp>" 
  path="" 
  reloadable="true" 
/>

자, <yourApp>앱 이름입니다 .. :)

이제 응용 프로그램이 기본 응용 프로그램으로 표시되며 http://localhost:8080

그러나 한 가지 부작용이 있습니다. 응용 프로그램이 두 번로드됩니다. 한 번만 localhost:8080및에 한 번 localhost:8080/yourApp. 이 문제를 해결하려면 응용 프로그램을 외부 <catalina_home>/webapps에 놓고 ROOT.xml의 docBase 태그에서 상대 또는 절대 경로를 사용하십시오. 이 같은;

<Context 
  docBase="/opt/mywebapps/<yourApp>" 
  path="" 
  reloadable="true" 
/>

그리고 모든 것이 정상입니다!


32
다운 투표? 그래, 왜? 더 나은 대안이 있다면 나에게도 알려주십시오! : D
Paaske

1
일반 webapps 폴더에서 다른 전쟁과 함께 작동합니까?
chrislovecnm 2009 년

5
이중 배포를 해결하려면 server.xml의 Host 속성에서 "deployOnStartup"및 "autoDeploy"false를 모두 설정할 수 있습니다.
Sefler

8
/ webapps 아래의 기본 ROOT 폴더 이름을 바꾸지 않으면 "고양이 돌아옵니다"는 ROOT.xml의 docBase를 재설정합니다. 이것은 VMWare의 vfabric tc 개발 서버에 있습니다.
hoserdude

3
Tomcat 7은 이제 / webapps 내부에 docBase를 허용하지 않으므로 war 파일을 다른 곳에서 찾아야합니다.
Mojo

12

다음 은 나를 위해 일한 유일한 솔루션을 따릅니다 . 이것을 conf / server.xml의 호스트 노드에 추가하십시오

<Context path="" docBase="yourAppContextName">

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

Tomcat server.xml 파일로 이동하여 경로를 비워 둡니다.


1
에있을 것 server.xmlcontext.xml? 나는 <Context>내 XML 태그 를 참조하십시오context.xml
Saif

6
server.xml에는 컨텍스트 xml 태그도 있지만 컨텍스트 정의를위한 server.xml 사용법은 권장하지 않습니다.
İsmail Yavuz

4

Tomcat 9.0에서는 다음에서 변경해야합니다. server.xml

<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

3

이 작은 코드는 가상 호스트를 사용하여 나를 위해 일했습니다.

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>

이것은 server.xml? 예를 들어 위의 Ali.Mojtehedy에 따르면 문제가 있습니다. 또한 다른 답변 은 일반적인 webapps 경로 밖에/path/to 있어야 합니다.
Jean Jordaan

잘 작동하는 것 같습니다. 물론 ROOT 응용 프로그램이 동일한 웹 응용 프로그램 폴더에 존재하여 자신과 충돌하기를 원하지 않습니다.
Anthony Hayward

2

가장 빠르고 최상의 솔루션 일 수 있습니다. <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

그리고 귀하의 웹앱은 http://<host>:<port>/


1
해당 docBase 디렉토리가 특정 폴더에 대해 절대적입니까 아니면 상대적입니까?
호세 마르티네즈

3
나는 이것을 시도했지만 작동하지 않는다. Foobar에서 호출 한 앱이 있습니다 /opt/tomcat/webapps/Foobar. docBase를 Foobarand로 설정하려고 시도했지만 /opt/tomcat/webapps/Foobar`http : // <host> : <port> /로 이동하면 여전히 Foobar 앱 대신 Tomcat 홈 페이지가 표시됩니다. 나는 심지어 Tomcat을 다시 시작했다. 내가 뭘 잘못하고 있죠?
kimbaudi

경로를 null로 만들면 앱에 도달하지 않습니다.
Snickers3192

1

한 달 동안이 문제에 직면했습니다 .server.xml에 컨텍스트 태그를 넣는 것은 안전하지 않습니다. 다른 모든 호스트에 배포하는 컨텍스트 요소에 영향을 미칩니다. 큰 응용 프로그램의 경우 연결 오류가 발생하여 격리가 잘 이루어지지 않습니다. .com / domain1Folder !! 또한 데이터베이스 세션 연결이 두 번로드되었습니다! 다른 방법은 컨텍스트 태그가있는 ROOT.xml 파일을 전체 경로와 함께 넣는 것입니다.

 <Context path="" docBase="/var/lib/tomcat7/webapps/ROOT" />

conf / catalina / webappsfoldername에서 warapp를 webappsfoldername 내에 ROOT.war로 배포하고 호스트와 같은 호스트를 지정하십시오.

 <Host name="domianname"  appBase="webapps2" unpackWARs="true"  autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false" >

        <Logger className="org.apache.catalina.logger.FileLogger"
               directory="logs"  prefix="localhost_log." suffix=".txt"
          timestamp="true"/>
</Host>

이 접근법에서 동일한 유형의 앱에 대해서도 사용자 세션이 잘 격리되지 않았습니다! app1과 app1이 동일한 경우 app1 내부에있을 수 있습니다. 서버 측 세션으로 로그인 한 후 자동으로 app2에 로그인 할 수 있습니까?! 따라서 사용자 세션을 jsessionid가 아닌 클라이언트 측 캐시에 보관해야합니다! 로컬 호스트에서 엔진 이름을 변경하여 해결할 수 있습니다. 그러나 바람둥이를 가지고 노는 것은 다른 고양이를 가지고 노는 것보다 더 많은 시간이 필요하다고 말합시다!


1

server.xml 또는 ROOT.xml과 같은 서버 구성을 업데이트하지 않는 것이 좋습니다.

컨텍스트 경로 설정을 포함하여 웹 응용 프로그램 META-INF 디렉토리에 context.xml 구성 파일을 넣을 수 있습니다. 이것은 기본 서버 설정을 무시합니까?

즉 :

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">

1

<Context docBase="yourAppName" path="" reloadable="true">

Tomcat server.xml 파일로 이동하여 경로를 비워 둡니다.


1

Tomcat 8 : 많은 검색 후 이것은 server.xml의 작동 코드 일뿐입니다.

<!-- Set /apple as default path -->
    <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
     <Context path="" docBase="apple">
         <!-- Default set of monitored resources -->
         <WatchedResource>WEB-INF/web.xml</WatchedResource>
     </Context>
    </Host>

Tomcat을 다시 시작하고 127.0.0.1:8080에 액세스하면 127.0.0.1:8080/apple의 내용이 표시되는지 확인하십시오.

내 프로젝트는 netbeans에 의해 생성 된 Java 웹 응용 프로그램 마녀 였고 프로젝트 구성에서 컨텍스트 경로를 설정했습니다. 애플도 web.apps 폴더에 apple.war을 넣었습니다.


1

나를 위해 두 가지 답변이 모두 효과가있었습니다.

  1. / conf / Catalina / localhost /에 ROOT.xml이라는 파일 추가
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. server.xml에 항목 추가
<Service name="Catalina2">
    <Connector port="8070" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8743" />
    <Engine name="Catalina2" defaultHost="localhost">
        <Host name="localhost"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/tmp/wars/hpong"  reloadable="true">
                <WatchedResource>WEB-INF/web.xml</WatchedResource>
            </Context>
      </Host>
    </Engine>
</Service>

참고 : 컨텍스트에서 docBase를 선언하면 호스트에서 appBase를 무시하십시오.

  1. 그러나 나는 전쟁 이름을로 변환 ROOT.war하여 webapps 아래에 배치하는 것을 선호 했습니다. 따라서 다른 전쟁 (contextpaths)의 일치하지 않는 URL 요청 이이 전쟁에 착륙합니다. ROOT ( "/ **") 컨텍스트 경로를 처리하는 것이 더 좋습니다.

두 번째 옵션은 Webapps 폴더에서 wars를 (double)로드하는 것입니다. 또한 압축되지 않은 war 폴더 만 있으면됩니다.




1

Tomcat 8.X에서 server.xml의 tomcat 홈 디렉토리 / conf / 폴더 아래에 아래 표시된 것처럼 <Context>태그 아래에 <Host>태그를 추가 할 수 있습니다 . 그러나 적용하려면 서버를 다시 시작해야합니다

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

     <Context docBase="${catalina.base}\webapps\<Your App Directory Name>" path="<your app path you wish>" reloadable="true" />
  </Host>

또는 Tomcat 7.X를 사용하는 경우 프로젝트의 WEB-INF 폴더에 context.xml 파일을 추가 할 수 있습니다. 사용한 파일의 내용은 다음과 같습니다. 그리고 그것은 나를 위해 잘 작동했습니다. 이 경우 서버를 다시 시작할 필요가 없습니다.

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

<Context docBase="${catalina.base}\webapps\<My App Directory Name>" path="<your app path you wish>" reloadable="true" />

tomcat : 9.0 docker에서 테스트되었으며 8.0으로 작동합니다. localhost:8080/<Your App Directory Name>/그리고 localhost:8080/<your app path you wish>/이 두 URL을 모두 동시에 작동합니다. 아래에이 두 개의 추출 된 폴더가 $CATALINA_HOME/webapps/있습니다.
niaomingjian

1

가장 간단하고 유연한 솔루션은 다음과 같습니다. Inside $ {Tomcat_home} /config/server.xml

아래와 같이 Host 요소 에서 autoDeploy = "false"deployOnStartup = "false"를 변경하십시오 .

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="false">

호스트 요소 아래에 아래 행을 추가하십시오 .

<Context path="" docBase="ServletInAction.war"  reloadable="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
        </Context>

위의 접근 방식을 사용하면 컨텍스트 경로 이름이 다른 웹 애플리케이션 아래에 많은 애플리케이션을 추가 할 수 있습니다.


구성 위에 doinf가없는 다른 솔루션은 war 파일의 이름을 root.war로 바꾸고 webapps 디렉토리에 넣는 것입니다. 자동 컨텍스트 경로는 /로 설정됩니다.
라비 굽타

-6

아래 트릭은 나를 위해 일했습니다.

1) Tomcat의 server.xml 파일 (conf 폴더 내부)에서 아래 구성을 주석 처리 / 삭제하십시오.

2) tomcat webapps 폴더 안에있는 기존 ROOT 폴더 (있는 경우)를 삭제하십시오. war (예 : test.war) 파일의 이름을 ROOT.war로 바꾸십시오.

war 파일의 이름을 ROOT.war로 바꾸는 동안 "ROOT"는 대문자 여야합니다.

제한 사항 : 하나의 Tomcat 인스턴스 내에 하나의 응용 프로그램 만 배포 할 수 있습니다.


3
질문에서 : "웹앱 (또는 WAR 파일)의 이름을 ROOT로 바꿀 수 있다는 것을 알고 있지만 IMHO는 끔찍한 방법입니다."
Jean Jordaan

1
Tomcat 인스턴스 당 하나의 webapp 만 사용하도록 제한하고 싶지 않습니다.
ulrich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.