通过只替换单个类文件来更新Java web应用程序可以吗?
有时,当我们对我们的web应用程序进行小的更改时,例如bug修复,我们不会每次构建一个全新的WAR文件,而只是在通过只替换单个类文件来更新Java web应用程序可以吗?,java,web-applications,Java,Web Applications,有时,当我们对我们的web应用程序进行小的更改时,例如bug修复,我们不会每次构建一个全新的WAR文件,而只是在web-INF/classes下的分解web应用程序目录中替换受影响的类文件,然后重新启动应用程序 可以吗?我认为这可能不是最佳做法,因为版本控制:您如何知道已部署应用程序的哪个版本?如果您部署了一个.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查询(一个字符串)是作为内联的
- 在开发过程中,IDE(我使用Eclipse)负责热部署
- 在生产系统上,假设只替换一个.class文件就足够了是不明智的。应考虑全面部署