Java+Tomcat:使用已部署的 WAR 文件继续开发(手头没有源代码)
Java+Tomcat: Continuing development with deployed WAR file (without source code on hand)
我有一个从远程服务器下载的已编译 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 中(我可以看到内容.class
个文件,因为我正在使用的 IDE 中有这样的功能,但是那些 class 文件处于只读模式。但是我无法编译 MyServlet
文件(无法将 MyServlet.java
转换为 MyServlet.class
。因为 class 的其余部分已经编译(.class
格式,而不是 .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
之类的东西,但是如果我需要导入项目中已经存在的 class 怎么办?它会变得有点乱,我想...
在没有源代码的情况下继续开发的最有机的方式是什么?
我在想的是构建一个单独的 Spring 启动应用程序,但是它将在不同的端口中并且需要进行一次身份验证(意思是,我不能要求用户再次登录当 he/she 在应用程序之间切换时)。
我正在使用 java-8,应用程序部署在 tomcat-7(如果有帮助)
如果您计划不断进行更多更改,并且如果在您的情况下确实允许反编译 classes,我认为最简单的解决方案是创建一个新项目,反编译所有现有项目classes,并将它们添加到新项目中。
如果是一次性更改,你可以解压war文件,将解压后的WEB-INF/classes
目录添加到你正在编译的新文件的class路径中(对于例如,javac -cp path/to/tomcat/servlet-api.jar:path/to/unzipped-warfile/WEB-INF/classes MyServlet.java
),然后将新编译的class添加到WEB-INF/classes
并重新打包成war文件。
我有一个从远程服务器下载的已编译 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 中(我可以看到内容.class
个文件,因为我正在使用的 IDE 中有这样的功能,但是那些 class 文件处于只读模式。但是我无法编译 MyServlet
文件(无法将 MyServlet.java
转换为 MyServlet.class
。因为 class 的其余部分已经编译(.class
格式,而不是 .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
之类的东西,但是如果我需要导入项目中已经存在的 class 怎么办?它会变得有点乱,我想...
在没有源代码的情况下继续开发的最有机的方式是什么?
我在想的是构建一个单独的 Spring 启动应用程序,但是它将在不同的端口中并且需要进行一次身份验证(意思是,我不能要求用户再次登录当 he/she 在应用程序之间切换时)。
我正在使用 java-8,应用程序部署在 tomcat-7(如果有帮助)
如果您计划不断进行更多更改,并且如果在您的情况下确实允许反编译 classes,我认为最简单的解决方案是创建一个新项目,反编译所有现有项目classes,并将它们添加到新项目中。
如果是一次性更改,你可以解压war文件,将解压后的WEB-INF/classes
目录添加到你正在编译的新文件的class路径中(对于例如,javac -cp path/to/tomcat/servlet-api.jar:path/to/unzipped-warfile/WEB-INF/classes MyServlet.java
),然后将新编译的class添加到WEB-INF/classes
并重新打包成war文件。