GNU/Linux >> Belajar Linux >  >> Linux

Eksternalisasi konfigurasi webapp Tomcat dari file .war

Saya suka .properties file bukan

  • JNDI - mengapa membangun objek kompleks selama konfigurasi program bukannya waktu inisialisasi?
  • properti sistem - Anda tidak dapat mengonfigurasi beberapa instance WAR yang sama secara terpisah dalam satu Tomcat
  • parameter konteks - hanya dapat diakses di javax.servlet.Filter , javax.servlet.ServletContextListener yang membuat saya tidak nyaman

Tomcat 7 Context menahan elemen Loader. Menurut deskriptor penerapan dokumen (apa yang ada di <Context> tag) dapat ditempatkan di:

  • $CATALINA_BASE/conf/server.xml - buruk - memerlukan restart server untuk membaca ulang konfigurasi
  • $CATALINA_BASE/conf/context.xml - buruk - dibagikan di semua aplikasi
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml - buruk - memerlukan pengemasan ulang untuk mengubah konfigurasi
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml - bagus , tapi lihat opsi terakhir!!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml - bagus , tapi lihat opsi terakhir!!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml - terbaik - sepenuhnya keluar dari aplikasi dan secara otomatis memindai perubahan!!!

Context dapat menyimpan Loader khusus org.apache.catalina.loader.VirtualWebappLoader (tersedia di Tomcat 7 modern, Anda dapat menambahkan classpath terpisah sendiri ke .properties Anda ), dan Parameter (diakses melalui FilterConfig.getServletContext().getInitParameter(name) ) dan Environment (diakses melalui new InitialContext().lookup("java:comp/env").lookup("name") ):

<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
    <Resources className="org.apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>

    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>

Jika Anda menggunakan Spring dan itu konfigurasi XML:

<context:property-placeholder location="classpath:app.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.user}"/>
    <property name="username" value="${db.user}"/>
    <property name="password" value="${db.pass}"/>
</bean>

Dengan Spring menyuntikkan properti di atas ke dalam bidang kacang itu mudah:

@Value("${db.user}") String defaultSchema;

bukannya JNDI:

@Inject ApplicationContext context;
Enviroment env = context.getEnvironment();
String defaultSchema = env.getProperty("db.user");

Perhatikan juga bahwa EL mengizinkan ini (nilai default dan substitusi rekursif dalam):

@Value('${db.user:testdb}') private String dbUserName;

<property name='username' value='${db.user.${env}}'/>

Lihat juga:

  • Menambahkan direktori ke classpath Tomcat
  • Dapatkah saya membuat jalur kelas khusus berdasarkan basis per aplikasi di Tomcat
  • Cara membaca file properti di luar konteks aplikasi web saya di Tomcat
  • Konfigurasikan Tomcat untuk menggunakan file properti untuk memuat informasi koneksi DB
  • Haruskah Anda menyiapkan properti koneksi database di server.xml atau context.xml
  • Mengeksternalkan konfigurasi Tomcat

CATATAN Dengan memperluas classpath ke direktori langsung, Anda juga mengizinkan untuk mengeksternalkan konfigurasi lain , seperti logging, auth, atc. Saya mengeksternalkan logback.xml sedemikian rupa.

PEMBARUAN Tomcat 8 mengubah sintaks untuk <Resources> dan <Loader> elemen, bagian yang sesuai sekarang terlihat seperti:

<Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>

tomcat/conf/Catalina/<host> Anda dapat berisi deskriptor konteks yang memungkinkan Anda mengonfigurasi banyak hal termasuk mendefinisikan "entri lingkungan", yang dapat diakses dari Java melalui JNDI. Ada banyak cara untuk menggunakannya. Secara pribadi, saya menetapkan entri lingkungan yang merupakan jalur sistem file ke file properti saya. Aplikasi saya dibuat untuk memeriksa entri ini, dan jika tidak ada, cari file di classpath sebagai gantinya. Dengan begitu, di dev, kami memiliki properti dev di classpath, tetapi saat kami membuat dan menerapkan, kami mengarahkannya ke file eksternal.

Ada dokumentasi yang bagus untuk mengonfigurasi konteks di situs web Tomcat. Lihat Menentukan Konteks bagian detail tentang cara membuat file dan di mana harus meletakkannya.

Sebagai contoh, jika host Anda bernama myHost dan aplikasi Anda adalah file perang bernama myApp.war di webapps direktori, maka Anda dapat membuat tomcat/conf/Catalina/myHost/myApp.xml dengan konten ini:

<Context>
    <Environment name="configurationPath" value="/home/tomcat/myApp.properties" type="java.lang.String"/>
</Context>

Kemudian dari kode Anda, Anda akan melakukan pencarian JNDI di java:comp/env/configurationPath (95% kepastian di sini) untuk mendapatkan nilai string tersebut.


Anda dapat mencoba menempatkan konfigurasi Anda (file properti) di Apache Tomcat\lib dalam file JAR dan menghapusnya dari aplikasi web. Ketika pemuat kelas Tomcat tidak menemukan konfigurasi Anda di webapp, ia akan mencoba mencari di direktori "lib". Jadi, Anda dapat mengeksternalkan konfigurasi Anda hanya dengan memindahkan konfigurasi ke direktori lib global (itu dibagikan di antara aplikasi web lain).


Linux
  1. Jadikan Ls Bedakan Script Dari Biner Di Output?

  2. Bagaimana Cara Menghapus Bom Dari File Utf-8?

  3. Bagaimana Cara Cat File Dari Awk?

  1. Awk Dari Baris Yang Berbeda?

  2. Buat Data Pembacaan Teks Dari File?

  3. Membaca dari file dalam perakitan

  1. Buat PEM dari file PPK

  2. menyalin file dari windows ke Linux

  3. bagaimana cp -f berbeda dari cp --remove-destination?