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 - 已部署 :: 如何从资源目录中读取文件 [重复]
使用 War 文件部署到 Tomcat 导致 ClassNotFoundException