部署J2EE/Java Web应用程序的两种主要方式(在非常简单的意义上):
部署已组装的构件到生产环境中:
在这种情况下,我们在其他地方创建了.war文件(或其他文件),将其配置为生产环境(可能为多个盒子创建 numerous artifacts ),并将生成的构件放置在生产服务器上。
优点:生产环境中没有开发工具,可以直接重复使用测试中的构件,执行部署的人员不需要了解构建过程。
缺点:创建和部署构件需要两个过程;预先构建的构件的潜在复杂配置可能使流程难以脚本化/自动化;必须对二进制构件进行版本控制。
在生产环境中构建构件:
在这种情况下,日常用于在开发人员桌面上构建和部署的相同过程用于部署到生产环境。
优点:只需维护一个过程;并且它经过频繁使用进行了大量测试/验证。在构件创建时可能更容易定制配置,而不是在后期定制预先构建的构件;不需要对二进制构件进行版本控制。
缺点:所有生产环境中都可能需要复杂的开发工具;部署人员需要了解构建过程;您没有部署您测试过的东西。
我主要使用第二个过程,但是这也是出于必要性(没有时间/优先级进行另一个部署过程)。个人而言,我不认同“生产环境必须清除所有编译器等”的论点,但我可以理解部署已测试的内容(而不是构建另一个构件)的逻辑。
然而,Java Enterprise应用程序对配置非常敏感,因此在配置构件时有两个流程似乎会引发麻烦。
想法是什么?
更新:
以下是一个具体的示例:
我们使用OSCache,并启用磁盘缓存。配置文件必须位于.war文件中,并引用文件路径。该路径在每个环境中都不同。构建过程检测用户配置的位置,并确保放置在war中的属性文件对其环境正确。
如果我们将构建过程用于部署,那么只需为生产环境创建正确的配置即可(例如 production.build.properties )。
如果我们遵循“部署已组装的构件到生产环境中”,则需要另一个过程来提取(不正确的)OSCache属性并将其替换为适合于生产环境的属性。
这样就创建了两个过程来完成相同的事情。
因此,问题是:
是否可以避免这种情况而无需在生产环境上进行编译?
如果不能,这是否值得?“不要重复自己”的价值大于“不在生产环境中编译”吗?
部署已组装的构件到生产环境中:
在这种情况下,我们在其他地方创建了.war文件(或其他文件),将其配置为生产环境(可能为多个盒子创建 numerous artifacts ),并将生成的构件放置在生产服务器上。
优点:生产环境中没有开发工具,可以直接重复使用测试中的构件,执行部署的人员不需要了解构建过程。
缺点:创建和部署构件需要两个过程;预先构建的构件的潜在复杂配置可能使流程难以脚本化/自动化;必须对二进制构件进行版本控制。
在生产环境中构建构件:
在这种情况下,日常用于在开发人员桌面上构建和部署的相同过程用于部署到生产环境。
优点:只需维护一个过程;并且它经过频繁使用进行了大量测试/验证。在构件创建时可能更容易定制配置,而不是在后期定制预先构建的构件;不需要对二进制构件进行版本控制。
缺点:所有生产环境中都可能需要复杂的开发工具;部署人员需要了解构建过程;您没有部署您测试过的东西。
我主要使用第二个过程,但是这也是出于必要性(没有时间/优先级进行另一个部署过程)。个人而言,我不认同“生产环境必须清除所有编译器等”的论点,但我可以理解部署已测试的内容(而不是构建另一个构件)的逻辑。
然而,Java Enterprise应用程序对配置非常敏感,因此在配置构件时有两个流程似乎会引发麻烦。
想法是什么?
更新:
以下是一个具体的示例:
我们使用OSCache,并启用磁盘缓存。配置文件必须位于.war文件中,并引用文件路径。该路径在每个环境中都不同。构建过程检测用户配置的位置,并确保放置在war中的属性文件对其环境正确。
如果我们将构建过程用于部署,那么只需为生产环境创建正确的配置即可(例如 production.build.properties )。
如果我们遵循“部署已组装的构件到生产环境中”,则需要另一个过程来提取(不正确的)OSCache属性并将其替换为适合于生产环境的属性。
这样就创建了两个过程来完成相同的事情。
因此,问题是:
是否可以避免这种情况而无需在生产环境上进行编译?
如果不能,这是否值得?“不要重复自己”的价值大于“不在生产环境中编译”吗?