Menyebarkan aplikasi saya di root di Tomcat

132

Saya memiliki file perang aplikasi saya. Saya perlu menggunakan ini di tingkat root. URL saat ini adalah http://localhost:8080/war_name/application_name.

iamjustcoder
sumber
1
Bisakah Anda jelaskan apa sebenarnya masalah Anda? Ketika Anda menggunakan file perang di kucing jantan, aplikasi diakses menggunakan URL: localhost: 8080 / war_name tanpa ekstensi .war.
ashishjmeshram
1
Ya Anda benar, saya perlu mengakses aplikasi saya. " localhost / application_name ", ini saya dapat raih ketika saya mengganti nama file perang saya menjadi "ROOT.war", tetapi membuang pengecualian memori karena ukuran file perang saya adalah sekitar 120MB
iamjustcoder
1
@ user661660 - Sepertinya Anda memiliki masalah yang berbeda - mengganti nama menjadi ROOT.warberfungsi. Saya akan menyarankan mengajukan pertanyaan lain tentang Anda OutOfMemoryException, memberikan jejak tumpukan dan detailnya. Anda mungkin bisa mengatasinya dengan mengkonfigurasi -Xmxuntuk JVM.
Rob Hruska
.lang.OutOfMemoryError: PermGen space 16 Mar 2011 9:52:52 AM com.ebay.kernel.logger.Logger log BEVERE: Kesalahan pada thread Perfmon java.lang.OutOfMemoryError: ruang PermGen Pengecualian di thread "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Exception di thread" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16 Mar 2011 9:53:36 com.ebay.kernel.logger.Logger log SEVERE: Kesalahan di Perfmon utas java.lang.OutOfMemoryError: PermGen space Exception in thread "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder
1
@ user661660 - Mungkin beberapa jawaban untuk pertanyaan ini dapat membantu Anda.
Rob Hruska

Jawaban:

220

Anda memiliki dua pilihan:

  1. Hapus ROOT/direktori out-of-the-box dari tomcat dan ubah nama file perang Anda ROOT.warsebelum menyebarkannya.

  2. Menyebarkan perang Anda sebagai (dari contoh Anda) war_name.wardan mengkonfigurasi akar konteks di conf/server.xmluntuk menggunakan file perang Anda:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>

Yang pertama lebih mudah, tetapi sedikit lebih kludgy. Yang kedua mungkin cara yang lebih elegan untuk melakukannya.

Rob Hruska
sumber
3
Jika Tomcat disetel ke autodeploy, Anda tidak perlu khawatir tentang opsi 2.
Buhake Sindi
4
@Delel - Tidak ada yang secara teknis. Saya sendiri sudah melakukannya; itu menyelesaikan pekerjaan. Hanya merasa sedikit tidak enak harus mengubah nama file perang Anda sendiri untuk sesuatu yang semacam detail implementasi wadah.
Rob Hruska
4
Sesuai tautan yang Anda berikan, TIDAK disarankan untuk menempatkan elemen <Context> secara langsung di file server.xml
Nilesh
6
Jawaban ini merekomendasikan teknik yang secara eksplisit disebutkan dalam dokumentasi sebagai bentuk buruk. Teknik yang tepat dijelaskan di sini: stackoverflow.com/questions/41263245/…
Christopher Schultz
5
+1 untuk memanggilnya ROOT.war. Menurut dokumen Tomcat, Anda harus sangat berhati-hati ketika menentukan "path" untuk menghindari penyebaran ganda: "Bahkan ketika mendefinisikan konteks secara statis di server.xml, atribut ini tidak boleh ditetapkan kecuali jika basis dokumen tidak terletak di bawah Host. appBase atau keduanya deployOnStartup dan autoDeploy salah. Jika aturan ini tidak diikuti, penyebaran ganda kemungkinan akan terjadi. " - dari tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward
31

pada tomcat v.7 (instalasi vanilla)

di conf / server.xml Anda tambahkan bit berikut di akhir file, tepat sebelum </Host>tag penutup:

<Context path="" docBase="app_name">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Perhatikan bahwa atribut docBase . Ini bagian yang penting. Anda juga memastikan bahwa Anda telah menggunakan app_name sebelum Anda mengubah aplikasi web root Anda, atau cukup salin webapp Anda yang belum terbongkar (app_name) ke dalam folder webapp tomcat Anda. Mulai, kunjungi root, lihat namamu di sana!

Peter Perháč
sumber
13

Di kucing jantan 7 dengan perubahan ini, saya dapat mengakses myAPP di / dan ROOT di / ROOT

<Context path="" docBase="myAPP">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="ROOT" docBase="ROOT">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Tambahkan di atas ke <Host>bagian di server.xml

Sudheer Palyam
sumber
3
Jalur konteks harus berupa string kosong atau mulai dengan '/'. Jalur [ROOT] tidak memenuhi kriteria ini dan telah diubah menjadi [/ ROOT]
Nikita Bosik
11

Saya tahu bahwa jawaban saya agak tumpang tindih dengan beberapa jawaban lainnya, tetapi ini adalah solusi lengkap yang memiliki beberapa kelebihan. Ini bekerja pada Tomcat 8:

  1. Aplikasi utama dilayani dari root
  2. Penyebaran file perang melalui antarmuka web dipertahankan.
  3. Aplikasi utama akan berjalan pada port 80 sementara hanya admin yang memiliki akses ke folder manajemen (saya menyadari bahwa sistem * nix membutuhkan superuser untuk mengikat ke 80, tetapi pada windows ini bukan masalah).

Ini berarti bahwa Anda hanya perlu me-restart tomcat sekali, dan setelah file perang yang diperbarui dapat digunakan tanpa masalah.

Langkah 1: Di file server.xml, cari entri konektor dan ganti dengan:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

Langkah 2: Tentukan konteks dalam <Host ...>tag:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Perhatikan bahwa saya membahas semua aplikasi di folder webapp. Yang pertama secara efektif mengganti aplikasi root dan utama dari posisi. ROOT sekarang aktif http://example.com/ROOTdan aplikasi utama menyala http://example.com/. Aplikasi web yang dilindungi kata sandi memerlukan privileged="true"atribut.

Ketika Anda menggunakan file CAS.war yang cocok dengan root ( <Context path="/" docBase="CAS">Anda harus memuat ulang yang di panel admin karena tidak menyegarkan dengan penyebaran.

Jangan sertakan <Context path="/CAS" docBase="CAS">dalam konteks Anda karena menonaktifkan opsi manajer untuk menyebarkan file perang. Ini berarti Anda dapat mengakses aplikasi dengan dua cara: http://example.com/danhttp://example.com/APP/

Langkah 3: Untuk mencegah akses yang tidak diinginkan ke folder root dan manager, tambahkan a valveke tag konteks seperti ini:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

Ini pada dasarnya membatasi akses ke folder aplikasi web admin untuk orang-orang dari domain saya sendiri (alamat IP palsu) dan localhost ketika mereka menggunakan port default 8080 dan mempertahankan kemampuan untuk menyebarkan file perang secara dinamis melalui antarmuka web.

Jika Anda ingin menggunakan ini untuk beberapa aplikasi yang menggunakan alamat IP yang berbeda, Anda dapat menambahkan alamat IP ke konektor ( address="143.21.2.1").

Jika Anda ingin menjalankan beberapa aplikasi web dari root, Anda dapat menduplikasi tag Layanan (menggunakan nama yang berbeda untuk yang kedua) dan mengubah docbase dari <Context path="/" docBase="CAS">ke misalnya <Context path="/" docBase="ICR">.

Kimvdinde
sumber
6

Cara tercepat.

  1. Pastikan Anda tidak memiliki aplikasi ROOT yang digunakan, tidak bekerja jika Anda memilikinya

  2. Ubah nama perang Anda menjadi ROOT.war, gunakan, itu saja, tidak ada perubahan konfigurasi yang diperlukan

Dima
sumber
6

Hapus $CATALINA_HOME/webapps/ROOT. Perbarui $CATALINA_HOME/conf/server.xml, pastikan elemen Host terlihat seperti teks berikut:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

Ia bekerja dengan Tomcat 8. autoDeploy dan deployOnStartup perlu disetel ke false untuk mencegah tomcat menggelar myAppdua kali.

Jingguo Yao
sumber
Saya mencoba mengunggah PERANG dan gagal berfungsi. Apakah ini hanya untuk PERANG yang meledak?
logixplayer
Saya mencoba mengunggah PERANG dan gagal berfungsi berdasarkan contoh @ Jingguo. Apakah ini hanya untuk PERANG yang meledak? EDIT: Memang HANYA untuk perang yang meledak. Kenapa ini? Bisakah saya tidak hanya mengunggah PERANG dan menghindari langkah ganda ini? Bagaimana saya bisa membuatnya bekerja?
logixplayer
@logixplayer. Solusi saya bekerja dengan WAR. Saya tidak meledakkannya. Saya lupa menyebutkan bahwa $CATALINA_HOME/webapps/ROOTperlu dihapus. Harap hapus dan coba lagi.
Jingguo Yao
Saya menghapus ROOT seperti yang Anda katakan. Saya mengerahkan PERANG (direktori tidak meledak). Saya perhatikan direktori ROOT baru dibuat dengan barang-barang saya di dalamnya misalnya WEB-INF. Situs sedang berjalan. Apakah ini cara yang seharusnya berhasil?
logixplayer
Saya juga mencoba metode ini dan semua ketika saya mencoba membuka halaman di browser itu hanya menunggu server. The catalina.out hanya mengatakan server dimulai.
Asu
1

Menambahkan ke sol @Rob Hruska, pengaturan ini di bagian server.xml bekerja:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

Catatan: override = "true" mungkin diperlukan dalam beberapa kasus.

AVM
sumber
Anda tidak menyebutkan di mana harus meletakkan ini. @Sudheer Palyam jawabannya sangat membantu.
Kannan Ramamoorthy
1

Menambahkan ke jawaban @Dima , jika Anda menggunakan mavenuntuk membangun paket Anda, Anda dapat mengatakannya untuk mengatur nama file WAR Anda ROOTdi pom.xml:

<build>
    <finalName>ROOT</finalName>
</build>

Secara default, tomcatakan menggunakan ROOT.warwebapp ke konteks root ( /).

Ali Tou
sumber
0

buka tomact manager url: - http: // localhost: 8080 / manager / html /
maka dalam aplikasi Anda melihat aplikasi yang memiliki path sebagai "/" digunakan
hanya Undeploy ini. Ubah nama file perang aplikasi Anda sebagai ROOT.war dan cukup tempatkan di jalur: - mulai Tomcat Anda Tidak perlu konfigurasi tambahan. Sekarang kita dapat melihat halaman beranda aplikasi atau url yang dikonfigurasi di http: // localhost: 8080
masukkan deskripsi gambar di sini
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
sumber
-1

Di server saya, saya menggunakan ini dan root autodeploy berfungsi dengan baik:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>
Mircea Stanciu
sumber
Ini tidak akan digunakan untuk / tetapi ke / mysite
tine2k