Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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
通过只替换单个类文件来更新Java web应用程序可以吗?_Java_Web Applications - Fatal编程技术网

通过只替换单个类文件来更新Java web应用程序可以吗?

通过只替换单个类文件来更新Java web应用程序可以吗?,java,web-applications,Java,Web Applications,有时,当我们对我们的web应用程序进行小的更改时,例如bug修复,我们不会每次构建一个全新的WAR文件,而只是在web-INF/classes下的分解web应用程序目录中替换受影响的类文件,然后重新启动应用程序 可以吗?我认为这可能不是最佳做法,因为版本控制:您如何知道已部署应用程序的哪个版本?如果您部署了一个.war文件,那么您的构建过程可以负责更新一个构建编号(来自源代码管理,或者单独更新,无论什么-只要每个构建都有一个不同的编号就可以了) 如果您正在使用持续集成(这绝对是一个好主意),那么

有时,当我们对我们的web应用程序进行小的更改时,例如bug修复,我们不会每次构建一个全新的WAR文件,而只是在
web-INF/classes
下的分解web应用程序目录中替换受影响的类文件,然后重新启动应用程序


可以吗?

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

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

因此,当您部署web应用程序时,您确切地知道哪个版本正在运行,以及哪个源代码构成了该版本


我认为,除了本地开发人员测试之外,通过更新单个.class文件进行小的增量更改可能不是一个好主意。

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

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

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

svn update
mvn clean compile war:exploded tomcat:inplace -P deployment
在pom.xml文件中有“部署”配置文件,其中包含部署环境所需的所有配置


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

从技术上讲,只要类/方法签名相同,它就应该可以工作。但正如Phill指出的,这不是世界上最好的主意


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

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

@Phill Sacre和其他人涵盖了这个问题的大部分方面。我面对的是另一个方面,我愿意做出贡献

简短回答:不,仅仅用类文件替换修改过的java文件可能还不够。请继续阅读以了解详细信息

这是我的设想

  • 我有一个.java,其中大部分包含SQL查询。我修改了一个查询,放入了新的.class文件,并跳转了Tomcat(未连接到我的IDE)。上一个查询仍在执行中
  • 当我替换所有的.class文件时,新的查询正在执行
诊断,

  • 我采用了两个maven构建并执行了目录比较
  • 令我惊讶的是,我发现2。类文件被修改了,而不是1。
    • 这个额外的.class文件实际上使用了我修改过的.class文件
  • 当我查看extra.class文件的反编译版本时,我发现SQL查询(一个字符串)是作为内联的
这清楚地解释了为什么替换一个类并不能解决这个问题。在这种情况下,替换第一个.class文件永远不会有效

吸取的教训。以下是我如何总结我从中学到的:

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