是否可以通过替换单个类文件来更新Java Web应用程序?

时间:2008-10-21 10:14:38

标签: java web-applications

有时,当我们对网络应用进行细微更改时,例如错误修复,我们不会每次都构建一个全新的WAR文件,而只是替换WEB-INF/classes下展开的Web应用程序目录中受影响的类文件,然后重新启动应用程序。

可以吗?

6 个答案:

答案 0 :(得分:13)

我认为这可能不是最佳做法,因为版本控制:您如何知道已部署的应用程序版本?如果你部署一个.war文件,你的构建过程可以负责更新构建号(来自源代码控制,或者单独,无论如何 - 只要每个构建都有不同的编号就可以了)。

如果你正在使用持续集成(这绝对是一个好主意),那么每次在源代码中进行更改时,你的构建过程都应该开出一个“工件”(war文件)。也许用版本号标记版本控制中的代码。

因此,在部署Web应用程序时,您确切地知道正在运行的版本以及构成该版本的源代码。

通过更新单个.class文件进行小的增量更改我认为除了本地开发人员测试之外的其他任何内容都不是一个好主意。

答案 1 :(得分:2)

您可以使用maven解决部署任务。

每次更改任何内容时,只需输入

即可
svn update
mvn clean compile war:exploded tomcat:inplace -P deployment

您的pom.xml文件中包含“部署”配置文件,其中包含部署环境所需的所有配置文件。

通过这种方式,您可以自动执行部署过程,并在手动复制错误/旧/ etc文件时永不失败。

答案 2 :(得分:2)

@Phill Sacre和其他涵盖了这个问题的大多数方面。我面对不同的方面,并愿意做出贡献。

简短回答:不,仅仅替换修改过的java文件的类文件可能还不够。请继续阅读。

这是我的情景。

  • 我有一个主要包含SQL查询的.java。我修改了一个查询,放入新的.class文件,然后退回Tomcat(未连接到我的IDE)。上一个查询仍在执行中。
  • 当我替换所有.class文件时,正在执行新查询。

要诊断,

  • 我接受了两个maven构建并执行了目录比较。
  • 令我惊讶的是,我发现修改了 2 .class文件,而不是1
    • 这个额外的.class文件实际上是使用我修改的.class文件。
  • 当我查看额外的.class文件的反编译版本时,我认为SQL查询(一个字符串)就像内联那样。

这清楚地解释了为什么更换一个课程没有解决问题。在这种情况下,替换第一个.class文件永远不会有效。

经验教训。以下是我对此的总结:

  • 在开发过程中,IDE(我使用Eclipse)负责热部署。
  • 在生产系统上,假设只替换一个.class文件就足够了。应考虑完整部署。

答案 3 :(得分:0)

同意PHill;似乎节省的时间可以忽略不计,潜在的风险很多

答案 4 :(得分:0)

从技术上讲,只要类/方法签名相同,它就应该有效。但正如菲尔指出的那样,这不是世界上最好的主意。

我假设您既不使用Apache Ant也不使用Apache Maven来创建.war文件。我强烈建议您选择一个可以自动创建.war文件的工具,正是为了避免像您所说的那种手动黑客攻击。我个人使用Maven,它负责编译,运行单元测试和打包我的应用程序。好东西:)

答案 5 :(得分:0)

只应在有限的基础上将更新的类文件注入应用程序,并且不应该是构建的标准活动。话虽这么说,我已经看到它在大型应用程序上完成,整个重建/重新打包需要几个小时,并且需要尽快修复错误。希望它有所帮助。