Java+Tomcat:使用已部署的 WAR 文件继续开发(手头没有源代码)

Posted

技术标签:

【中文标题】Java+Tomcat:使用已部署的 WAR 文件继续开发(手头没有源代码)【英文标题】:Java+Tomcat: Continuing development with deployed WAR file (without source code on hand) 【发布时间】:2022-01-20 18:00:08 【问题描述】:

我有一个从远程服务器下载的已编译的war 文件。我可以在本地运行应用程序。问题是我没有源代码,所有java文件都已经编译好了.class文件。

现在我想为现有项目添加一些新功能。该应用程序很旧,它使用web.xml 文件来声明servlet。例如:

    <servlet>
        <servlet-name>ServletOne</servlet-name>
        <servlet-class>path.to.ServletOne</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ServletTwo</servlet-name>
        <servlet-class>path.to.ServletTwo</servlet-class>
    </servlet>
...

我尝试在 web.xml 文件中添加一个新的 servlet 路径,例如:

    <servlet>
        <servlet-name>ServletOne</servlet-name>
        <servlet-class>path.to.ServletOne</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ServletTwo</servlet-name>
        <servlet-class>path.to.ServletTwo</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>path.to.MyServlet</servlet-class>
    </servlet>
...

然后我在path.to.MyServlet 下添加了一个新的.java 文件,并将另一个(编译的)servlet 中的所有代码复制粘贴到我的新servlet 类中(我可以看到.class 文件的内容,因为有这样的我正在使用的 IDE 中的一个功能,但这些类处于只读模式。但是我无法编译 MyServlet 文件(无法将 MyServlet.java 转换为 MyServlet.class。因为其余的类已经编译(@ 987654333@ 格式,而不是.java)和所有import 代码都不起作用(MyServlet 看不到其他文件)。

这是我在尝试javac MyServlet.java 时遇到的错误之一:

error: package javax.servlet.http does not exist
import javax.servlet.http.HttpServlet;

当然我可以使用javac -cp path/to/tomcat/servlet-api.jar MyServlet.java 之类的东西,但是如果我需要导入项目中已经存在的类怎么办?我想它会变得有点混乱......

在没有源代码的情况下继续开发最有机的方式是什么?

我在想的是构建一个单独的 Spring Boot 应用程序,但是它将在不同的端口中,并且需要进行一次身份验证(意思是,当他/她切换时,我不能要求用户再次登录应用程序)。

我正在使用 java-8,应用程序部署在 tomcat-7 上(如果有帮助)

【问题讨论】:

【参考方案1】:

如果您打算进行更多更改,并且在您的情况下确实允许反编译类,我认为最简单的解决方案是创建一个新项目,反编译所有现有类,然后将它们添加到新项目。

如果是一次性更改,可以解压war文件,将解压后的WEB-INF/classes目录添加到你正在编译的新文件的类路径中(例如javac -cp path/to/tomcat/servlet-api.jar:path/to/unzipped-warfile/WEB-INF/classes MyServlet.java),然后添加新编译的类到WEB-INF/classes 并重新打包成一个war文件。

【讨论】:

谢谢@Tim。第二种方法在我的情况下似乎更合适,但我需要澄清一下: 1. 战争文件已经解压缩。 2.你能详细说明一下“将WEB-INF/classes目录添加到我正在编译的新文件的类路径”吗?如果我以后要添加更多类,我是否必须对所有新类再次重复这个事情? 2.例如,javac -cp path/to/tomcat/servlet-api.jar:path/to/unzipped-warfile/WEB-INF/classes MyServlet.java(我用这个更新了答案)。是的,如果您需要添加更多类,则需要重复此操作,这就是为什么我建议在这种情况下创建一个新项目的原因。如果您不想反编译所有类,可以将已编译的类文件添加到新项目中。更重要的是要有一种可重现的方式来编译新类并重建战争(使用诸如 Maven、Gradle 等工具)。 我明白了。快速谷歌搜索表明,没有一种工具可以 100% 准确地反编译多个类。如果你知道,你能分享这样一个工具吗?我有大约 200 个类,手动反编译所有类需要太长时间。 100% 的准确率可能是不可能的(因为来自源代码的某些信息不存在于字节码中),但它可能足以满足您的目的。您的 IDE 反编译器也不会 100% 准确。您没有说您使用的是哪一个,但 IntelliJ IDEA 反编译器的引擎可从 GitHub 获得,并且可以在命令行上使用整个目录:github.com/JetBrains/intellij-community/tree/master/plugins/…。另见***.com/q/28389006/29470 (some information from the source code is not present in the byte code) 这行有点模棱两可。我完全没问题如果反编译的代码会丢失一些 cmets,不会与原始源代码具有相同的对齐方式等。但是如果它会丢失一些可能影响业务逻辑的重要信息,那么我不确定它有多可靠是...对不起,我没有提到它,但是这个项目非常重要,现在有成千上万的人在使用它。我绝对不能破坏它。而且我正在使用 IntelliJ IDEA 的默认反编译器

以上是关于Java+Tomcat:使用已部署的 WAR 文件继续开发(手头没有源代码)的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE - WAR - 已部署 :: 如何从资源目录中读取文件 [重复]

在tomcat管理界面部署war包项目失败

使用 War 文件部署到 Tomcat 导致 ClassNotFoundException

如何部署war包到tomcat服务器

将java web项目打包war文件然后发布到Tomcat,

tomcat部署项目(war文件)