JavaWeb部署:构建代码,还是部署.war?
部署J2EE/Java Web应用程序的两种主要方法(从非常简单的意义上讲): 将组装好的工件部署到生产箱 在这里,我们在其他地方创建JavaWeb部署:构建代码,还是部署.war?,java,deployment,jakarta-ee,Java,Deployment,Jakarta Ee,部署J2EE/Java Web应用程序的两种主要方法(从非常简单的意义上讲): 将组装好的工件部署到生产箱 在这里,我们在其他地方创建.war(或任何东西),为生产配置它(可能为许多盒子创建许多工件),并将结果工件放置在生产服务器上 优点:生产箱上没有开发工具,可以直接重用测试中的工件,部署人员不需要了解构建过程 Cons:创建和部署工件的两个过程;预构建工件的潜在复杂配置可能使流程难以编写脚本/实现自动化;必须对二进制工件进行版本转换 在生产框上构建工件 在这里,每天在开发人员机箱上本地构
.war
(或任何东西),为生产配置它(可能为许多盒子创建许多工件),并将结果工件放置在生产服务器上
- 优点:生产箱上没有开发工具,可以直接重用测试中的工件,部署人员不需要了解构建过程
- Cons:创建和部署工件的两个过程;预构建工件的潜在复杂配置可能使流程难以编写脚本/实现自动化;必须对二进制工件进行版本转换
- 优点:维护一个流程;通过频繁使用,它经过了大量测试/验证。可能更容易在工件创建时定制配置,而不是在事后定制预先构建的工件;不需要对二进制工件进行版本控制
- 缺点:所有生产箱上都需要潜在的复杂开发工具;部署人员需要了解构建过程;您没有部署您测试的内容
production.build.properties
)
如果我们要遵循“将组装好的工件部署到生产箱”,我们将需要一个额外的过程来提取(不正确的)OSCache属性,并将其替换为适合生产环境的属性
这将创建两个过程来完成相同的事情
因此,问题是:
- 如果没有“在生产中编译”,这是可以避免的吗
- 如果没有,这值得吗?“不在生产中编译”的价值是否大于“不重复自己”
我还使用了一个过程,通过这个过程,工件是用配置值的占位符构建的。部署战争时,战争将被分解,占位符将替换为适当的值 我工作过的大多数地方都使用了第一种方法,在war/ear之外单独部署了特定于环境的配置信息(并且更新得很少)。我强烈建议“将组装的工件部署到生产箱”,例如war文件。这就是为什么我们的开发人员使用相同的构建脚本(在我们的例子中是Ant)在他们的开发沙箱上构建war,就像用于创建finally工件一样。这样就可以调试代码以及代码本身,更不用说完全可重复了。 < P>如果你是相对于配置管理提出这个问题,那么你的答案需要基于你认为是一个被管理的工件。从CM的角度来看,让一些源文件集合在一个环境中而不是在另一个环境中工作是不可接受的情况。CM对环境变量、优化设置、编译器和运行时版本等非常敏感,您必须考虑这些因素
如果你问的是关于可重复流程创建的问题,那么答案需要基于你愿意忍受的痛苦的位置和数量。为了节省测试和部署周期中的工作量,使用.war文件可能需要更多的前期工作。使用源文件和构建工具可能会节省前期成本,但在部署过程的后期处理问题时,您将不得不承受额外的痛苦 更新具体示例
相对于你的例子要考虑的两件事。
通常,我会尝试将部署配置要求特定于部署位置。我坚决反对在生产箱上构建,因为这意味着您使用的构建与您测试的构建不同。这还意味着每台部署机器都有一个不同的JAR/WAR文件。如果没有其他问题,请进行统一构建,这样在跟踪bug时就不必担心服务器之间的不一致 此外,如果可以轻松地在构建和sou之间映射,则不需要将构建置于版本控制中
<replace file="${BUILDS.ROOT}/DefaultWebApp/WEB-INF/classes/log4j.xml" token="@@@" value="${LOG4J.WEBSPHERE.LOGS}"/>
<!-- update the war file We don't want the source files in the war file.-->
<war basedir="${BUILDS.ROOT}/DefaultWebApp" destfile="${BUILDS.ROOT}/myThomson.war" excludes="WEB-INF/src/**" update="true"/>