Tomcat 7.0でWebアプリケーションのコンテキストパスを設定する方法


162

私は自分のwebapp(またはWARファイル)の名前をROOTに変更できることを知っていますが、これはIMHOという恐ろしい方法です。今、私はtomcatドキュメントをチェックアウトしました、そしてそれは言う

要素をserver.xmlファイルに直接配置することはお勧めしません

だから私はそれを提案した別の方法で試してみました。

個別のContext要素は明示的に定義できます。アプリケーションファイル内の/META-INF/context.xmlにある個別のファイル内。

だから私/META-INF/context.xmlは次のコードでを作成しました、

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

しかし、サーバーを再起動したときにデプロイした後も、「/」でコンテキストを読み込めませんでしたが、 "/<WEB_APP_NAME>"

役立つポインタ。



1
ドキュメントに記載されている「server.xmlファイルに要素を直接配置することはお勧めしません」という理由は、次の文に続きます。「メインのconf / server.xmlファイルではできないため、コンテキスト構成の変更がより侵襲的になるためです。 Tomcatを再起動せずにリロードしてください。」以下の承認された回答は問題を直接解決しますが、このパスを再度変更する可能性が低いか、再起動があまり混乱しない場合は、server.xmlを変更してもそれほど不合理ではないようです。
リムスキー

回答:


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

ただし、副作用が1つあります。アプリケーションは2回ロードされます。1 localhost:8080回と1回localhost:8080/yourApp。これを修正するには、アプリケーションを<catalina_home>/webapps外側に置き、ROOT.xmlのdocBaseタグで相対パスまたは絶対パスを使用します。このようなもの;

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

そして、それはすべて大丈夫です!


32
反対票?いいけどなんで?より良い代替案がある場合は、私にも知らせてください!:D
Paaske

1
これは通常のwebappsフォルダー内の他のwarsで動作しますか?
chrislovecnm

5
二重配備を解決するには、server.xmlのHost属性に「deployOnStartup」と「autoDeploy」の両方をfalseに設定することもできます
Sefler

8
/ webappsの下にあるデフォルトのROOTフォルダーの名前を変更しないと、「猫が戻ってきて」、ROOT.xmlのdocBaseがリセットされることがわかりました。これは、VMWareのvfabric tc開発サーバーで発生します...警告されます。
hoserdude 2013年

3
Tomcat 7は/ webapps内のdocBaseを許可しないようです。そのため、warファイルを他の場所に配置することが必須であるように見えます。
Mojo

12

ここで私のために働いた唯一の解決策に従います。これをconf / server.xmlのHostノードに追加します

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

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

</Context>

Tomcat server.xmlファイルに移動し、パスを空白に設定します


1
になるserver.xmlcontext.xml?私はxmlタグ<Context>を自分の中に表示していますcontext.xml
Saif

6
コンテキストのserver.xmlの使用が推奨され画定しかしserver.xmlのコンテキストxmlタグもあります
イスマイル・ヤウス

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、2014年

正常に動作するようです。もちろん、ROOTアプリケーションが同じwebappsフォルダーに存在して競合することは望ましくありません。
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 16

パスをnullにすると、アプリに到達しません):
Snickers3192

1

私は1か月間この問題に直面しました。server.xml内にコンテキストタグを配置することは安全ではありません。他のすべてのホストにデプロイするコンテキスト要素に影響します。大きなアプリの場合、接続エラーも発生します。たとえば、フォルダー名domain2で他のサイトにアクセスする場合があります。 .com / domain1Folder !! データベースセッション接続も2回ロードされます!もう1つの方法は、次のようなフルパスのコンテキストタグを持つROOT.xmlファイルを配置することです。

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

conf / catalina / webappsfoldernameにあり、WARファイルをROOT.warとしてwebappsfoldername内にデプロイし、ホストなどを指定します

 <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とapp2が同じ場合、app1内にいる可能性があります。サーバー側セッションでログインした後、app2に自動的にログインできますか?したがって、ユーザーセッションをjsessionidではなく、クライアント側のキャッシュに保持する必要があります。エンジン名をlocalhostから変更して解決する場合があります。しかし、tomcatで遊ぶのは他の猫と遊ぶよりも時間がかかるとしましょう!


1

server.xmlやROOT.xmlなどのサーバー構成を更新することはお勧めしません。

context.xml構成ファイルは、コンテキストパス設定を含めて、web-application META-INFディレクトリの下に配置できます。これはデフォルトのサーバー設定を上書きしますか?

つまり:

<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アプリケーションの魔女でした、私はプロジェクト構成でコンテキストパスを設定しました。それ以外に、webappsフォルダーに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.warwebappsの下に配置することを好みました。そのため、他のwars(contextpaths)からの比類のないURLリクエストがこのwarに到達します。これは、ROOT( "/ **")コンテキストパスを処理するためのより良い方法です。

2番目のオプションは、Webアプリケーションフォルダーからwarsを読み込む(ダブル)ことです。また、頭痛の種である非圧縮の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>/これらの2つのURLの両方が同時に動作します。の下でこれらの2つの抽出されたフォルダを見つけました$CATALINA_HOME/webapps/
niaomingjian

1

最も単純で柔軟なソリューションを以下に示します:$ {Tomcat_home} /config/server.xml内

以下のように、Host要素の下のautoDeploy = "false" deployOnStartup = "false"を変更しますこれは必須です。

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

Host要素の下に以下の行を追加します。

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

上記のアプローチを使用すると、異なるコンテキストパス名を持つwebappsの下に多くのアプリケーションを追加できます。


上記の構成でdoinfを使用しない代替ソリューションは、warファイルの名前をroot.warに変更し、webappsディレクトリの下に置くだけです。自動的にコンテキストパスは/に設定されます。
Ravi Gupta、

-6

以下のトリックは私のために働いた。

1)tomcatのserver.xmlファイル(confフォルダー内)から以下の設定をコメント/削除します。

2)tomcat webappsフォルダー内にある既存のROOTフォルダー(ある場合)を削除します。そして、war(例:test.war)ファイルの名前をROOT.warに変更します。

warファイルの名前をROOT.warに変更するときは、「ROOT」は大文字にする必要があります。

制限:1つのtomcatインスタンス内にデプロイできるアプリケーションは1つだけです。


3
質問から:「私は自分のwebapp(またはWARファイル)の名前をROOTに変更できることを知っていますが、これは恐ろしい方法です、私見です。」
Jean Jordaan、2014年

1
Tomcatインスタンスごとに1つのWebアプリケーションを使用するだけに制限したくありません。
ulrich 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.