n0r*_*m1e 49 java tomcat java-ee
我有一个Web应用程序,它依赖于在安装后配置的一些资源和参数,如JDBC连接.
我提出的是在部署应用程序时提供由Tomcat META-INF/context.xml复制[engine-name]/[server-name]/[app-name].xml的内容.这样我所提供的是一个war文件,可以复制到appBase文件夹(webapps).Tomcat的文档说如果有这样的文件,它将不会被覆盖,这真的很棒,因为部署后所做的更改不会丢失.
但是这里有一个微妙的问题:由于我们通过复制到webapps目录来部署应用程序,因此Tomcat将首先卸载现有应用程序以及配置文件.这样,配置文件将被丢失/覆盖,这是不可取的.据我所知,Tomcat 不会修改此行为.
问题是:有没有办法通过以Tomcat不会删除现有配置文件的方式安装应用程序来解决此问题.或者,有更好的方法来打包应用程序吗?
请注意,我们不希望将autoDeploy设置为false,并且我们不能使用人工干预进行安装(使用Tomcat Manager Web应用程序排除).
如果我从.war文件中获取配置文件并将其单独复制[engine-name]/[server-name]/[app-name].xml,Tomcat仍会将其与我的应用程序关联,并在复制新的.war文件后将其删除.
另一个假设是:我们事先并不知道配置的值.我们将仅提供样本配置(占位符,如果您愿意),而实际配置将在稍后的某个时间执行(不一定在安装时间内).
谢谢
Mat*_*ell 43
解决方案很简单:不要在context.xml中放置配置.
这是我们使用的解决方案(适用于许多不同的外部客户):
我们有一场战争将在多种环境中使用,webapp.war.我们有三个环境,开发,集成和生产.集成和生产在客户现场.我们不知道客户端集成和生产站点的密码和文件路径.
我们结合使用两件事:JNDI查找数据库内容和外部属性文件.
在context.xml战争中提供的内容中,我们有一个ResourceLink
<ResourceLink name="jdbc/webapp"
global="uk.co.farwell.webapp.datasource.MySqlDataSource" />
Run Code Online (Sandbox Code Playgroud)
这提供了对全局定义的数据源的引用,该数据源在server.xmlfor Tomcat中定义.
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
name="uk.co.farwell.webapp.datasource.MySqlDataSource"
password="xxx" url="xxx" username="fff" />
Run Code Online (Sandbox Code Playgroud)
因此,可以通过编辑server.xml而不更改数据库详细信息来更改webapp.war.至关重要的是,这只需要为每个服务器执行一次,而不是重新部署.
在我们的弹簧配置中,要定义dataSource我们:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/webapp" />
Run Code Online (Sandbox Code Playgroud)
对于其他属性,我们有一个全局的application.properties文件,它与webapp.war一起提供,但不是战争的一部分.这是由-D命令行上的a引用来启动Tomcat.-Duk.co.farwell.webapp.applicationDir="/usr/xxx/fff".我们选择定义并读取属性文件.数据库的东西也可以通过这种方式完成,但是我们将失去Tomcat完成的池化.
另一件事:如果移动服务器,或者由于某种原因机器被更改,我们不必重建.这是客户及其基础设施人员的事情.
n0r*_*m1e 11
我设法以某种方式解决了这个问题.
1- 在 Tomcat的appBase 之外的某个地方安装一个爆炸的WAR目录,让我们假设它在/usr/local/MyApp.[如果您的应用程序从未爆炸的战争中运行,则可以使用WAR文件执行此步骤而不是WAR目录.]
2-将上下文配置文件复制到[tomcat.conf]/[engine]/[hostname]目录中,让我们调用它MyApp.xml.该文件将指向应用程序的位置:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Context configuration file for my web application -->
<Context docBase="/usr/local/MyApp" privileged="true" antiResourceLocking="false" antiJARLocking="false">
<Resource name="jdbc/myapp-ds" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="XXX" password="XXX"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" />
</Context>
Run Code Online (Sandbox Code Playgroud)
3-您现在可以自由修改配置文件.
4-通过在/ usr/local/MyApp中复制新版本的应用程序来更新应用程序
笔记:
a)此解决方案也适用于未扩展的.war文件,但由于我们使用Spring的Log4JConfigListener,因此它不会从未爆炸的.war文件运行.Tomcat不会将.war文件放在appBase(webapps)文件夹之外.
b)此方法不会阻止您在/usr/local/MyApp/META-INF/context.xml中使用context.xml,因为Tomcat在此配置中不会使用它.您可以在开发环境中使用它,将.war文件转储到appBase(webapps)文件夹中.
这是我到目前为止所做的,仍在寻找更好的解决方案.
小智 5
这就是我们如何管理从.WAR文件外部化webapp上下文的方法
例如,我有一个名为VirtualWebApp的webapp.
我将使用以下上下文定义创建类似VirtualWebApp.xml的文件:
<Context docBase="/home/appBase/VirtualWebApp" path="/VirtualWebApp" reloadable="true">
<Environment name="webservice.host" type="java.lang.String" value="1.2.3.4" />
<Environment name="webservice.port" type="java.lang.String" value="4040" />
</Context>
Run Code Online (Sandbox Code Playgroud)
要访问这些环境变量,您必须在下面编写代码(Just lookup):
InitialContext initialContext = new javax.naming.InitialContext();
host = (String)initialContext.lookup("java:comp/env/webservice.host");
port = (String)initialContext.lookup("java:comp/env/webservice.port");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80502 次 |
| 最近记录: |