Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaWeb部署:构建代码,还是部署.war?_Java_Deployment_Jakarta Ee - Fatal编程技术网

JavaWeb部署:构建代码,还是部署.war?

JavaWeb部署:构建代码,还是部署.war?,java,deployment,jakarta-ee,Java,Deployment,Jakarta Ee,部署J2EE/Java Web应用程序的两种主要方法(从非常简单的意义上讲): 将组装好的工件部署到生产箱 在这里,我们在其他地方创建.war(或任何东西),为生产配置它(可能为许多盒子创建许多工件),并将结果工件放置在生产服务器上 优点:生产箱上没有开发工具,可以直接重用测试中的工件,部署人员不需要了解构建过程 Cons:创建和部署工件的两个过程;预构建工件的潜在复杂配置可能使流程难以编写脚本/实现自动化;必须对二进制工件进行版本转换 在生产框上构建工件 在这里,每天在开发人员机箱上本地构

部署J2EE/Java Web应用程序的两种主要方法(从非常简单的意义上讲):

将组装好的工件部署到生产箱 在这里,我们在其他地方创建
.war
(或任何东西),为生产配置它(可能为许多盒子创建许多工件),并将结果工件放置在生产服务器上

  • 优点:生产箱上没有开发工具,可以直接重用测试中的工件,部署人员不需要了解构建过程
  • Cons:创建和部署工件的两个过程;预构建工件的潜在复杂配置可能使流程难以编写脚本/实现自动化;必须对二进制工件进行版本转换
在生产框上构建工件 在这里,每天在开发人员机箱上本地构建和部署所使用的相同过程用于部署到生产环境

  • 优点:维护一个流程;通过频繁使用,它经过了大量测试/验证。可能更容易在工件创建时定制配置,而不是在事后定制预先构建的工件;不需要对二进制工件进行版本控制
  • 缺点:所有生产箱上都需要潜在的复杂开发工具;部署人员需要了解构建过程;您没有部署您测试的内容
我主要使用了第二个过程,这是出于必要(没有时间/优先级用于另一个部署过程)。就我个人而言,我不相信“生产箱必须清除所有编译器等”这样的论点,但我可以看到部署测试内容的逻辑(而不是构建另一个工件)

然而,Java企业应用程序对配置非常敏感,有两个用于配置工件的进程就好像自找麻烦一样

想法

更新 下面是一个具体的例子:

我们使用OSCache,并启用磁盘缓存。配置文件必须位于.war文件中,并且它引用了一个文件路径。此路径在每个环境中都是不同的。构建过程检测用户配置的位置,并确保放置在war中的属性文件适合其环境

如果要使用构建过程进行部署,则需要为生产环境创建正确的配置(例如,
production.build.properties

如果我们要遵循“将组装好的工件部署到生产箱”,我们将需要一个额外的过程来提取(不正确的)OSCache属性,并将其替换为适合生产环境的属性

这将创建两个过程来完成相同的事情

因此,问题是:

  • 如果没有“在生产中编译”,这是可以避免的吗
  • 如果没有,这值得吗?“不在生产中编译”的价值是否大于“不重复自己”

存在配置服务,如heavy weight,大多数容器允许您使用JNDI进行一些配置。这将使配置与构建分离,但可能会有些过分。然而,它们确实存在。这在很大程度上取决于你的需要


我还使用了一个过程,通过这个过程,工件是用配置值的占位符构建的。部署战争时,战争将被分解,占位符将替换为适当的值

我工作过的大多数地方都使用了第一种方法,在war/ear之外单独部署了特定于环境的配置信息(并且更新得很少)。

我强烈建议“将组装的工件部署到生产箱”,例如war文件。这就是为什么我们的开发人员使用相同的构建脚本(在我们的例子中是Ant)在他们的开发沙箱上构建war,就像用于创建finally工件一样。这样就可以调试代码以及代码本身,更不用说完全可重复了。

< P>如果你是相对于配置管理提出这个问题,那么你的答案需要基于你认为是一个被管理的工件。从CM的角度来看,让一些源文件集合在一个环境中而不是在另一个环境中工作是不可接受的情况。CM对环境变量、优化设置、编译器和运行时版本等非常敏感,您必须考虑这些因素


如果你问的是关于可重复流程创建的问题,那么答案需要基于你愿意忍受的痛苦的位置和数量。为了节省测试和部署周期中的工作量,使用.war文件可能需要更多的前期工作。使用源文件和构建工具可能会节省前期成本,但在部署过程的后期处理问题时,您将不得不承受额外的痛苦

更新具体示例

相对于你的例子要考虑的两件事。

  • .war文件只是一个带有备用扩展名的.zip文件。您可以使用标准zip实用程序替换配置文件

  • 可能需要重新考虑是否需要将配置文件放在.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"/>