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).