Java 如何检查*.war文件的导入?

Java 如何检查*.war文件的导入?,java,war,javap,Java,War,Javap,我有一个旧的war文件,其中的源代码在我的旧机器去世时丢失了 它确实使用Tomcat8在那里运行,没有任何问题 在我的新机器上,当tomcat(8和9)试图部署war文件时,它会给我 。。。10个以上原因:java.lang.ClassNotFoundException: javafx.scene.image.image位于 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:

我有一个旧的war文件,其中的源代码在我的旧机器去世时丢失了

它确实使用Tomcat8在那里运行,没有任何问题

在我的新机器上,当tomcat(8和9)试图部署war文件时,它会给我

。。。10个以上原因:java.lang.ClassNotFoundException: javafx.scene.image.image位于 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180) ... 23多

我不记得在我的代码中直接使用过javafx

那么,如何检查*.war文件的导入,以查看哪个类或库导致了问题

我在示例类上尝试过javap,但从未看到任何导入


我知道javafx不再是运行时环境的一部分,这显然是问题的直接原因,但是对于这个应用程序,根本不需要javafx。

在.class文件上运行
javap-v-constants
,查看类引用

您可能希望通过
grep“=Class”
(Linux)或
findstr“=\Class”
(Windows)来传递输出,或者可能只是
grep javafx
/
findstr javafx

例如,即使是一个超级简单的“Hello World”程序也会使用多个类

公共类测试{
公共静态void main(字符串[]args){
System.out.println(“你好世界”);
}
}
输出

C:\path\to\classes\classes>javap-v-constants Test.class | grep“=class”
#1=等级#2//测试
#3=类#4//java/lang/Object
#17=类#18//java/lang/System
#25=类#26//java/io/PrintStream
它不显示
字符串的用法。要了解原因,请查看完整的常量池,该小程序的常量池是:

常量池:
#1=等级#2//测试
#2=Utf8测试
#3=类#4//java/lang/Object
#4=Utf8 java/lang/Object
#5=Utf8
#6=Utf8()V
#7=Utf8代码
#8=Methodref#3.#9//java/lang/Object.“:()V
#9=名称和类型#5:#6/“”:()V
#10=Utf8行号表
#11=Utf8 LocalVariableTable
#12=Utf8此
#13=Utf8 LTest;
#14=Utf8主
#15=Utf8([Ljava/lang/String;)V
#16=Fieldref#17.#19//java/lang/System.out:Ljava/io/PrintStream;
#17=类#18//java/lang/System
#18=Utf8 java/lang/System
#19=名称和类型#20:#21//out:Ljava/io/PrintStream;
#20=Utf8输出
#21=Utf8 Ljava/io/PrintStream;
#22=字符串#23//Hello World
#23=Utf8你好世界
#24=Methodref#25.#27//java/io/PrintStream.println:(Ljava/lang/String;)V
#25=类#26//java/io/PrintStream
#26=Utf8 java/io/PrintStream
#27=名称和类型#28:#29//println:(Ljava/lang/String;)V
#28=Utf8打印LN
#29=Utf8(Ljava/lang/String;)V
#30=Utf8参数
#31=Utf8[Ljava/lang/String;
#32=Utf8源文件
#33=Utf8 Test.java
由于不需要所有字符串常量,因此可以使用
grep-vutf8

#1=Class#2//测试
#3=类#4//java/lang/Object
#8=Methodref#3.#9//java/lang/Object.“:()V
#9=名称和类型#5:#6/“”:()V
#16=Fieldref#17.#19//java/lang/System.out:Ljava/io/PrintStream;
#17=类#18//java/lang/System
#19=名称和类型#20:#21//out:Ljava/io/PrintStream;
#22=字符串#23//Hello World
#24=Methodref#25.#27//java/io/PrintStream.println:(Ljava/lang/String;)V
#25=类#26//java/io/PrintStream
#27=名称和类型#28:#29//println:(Ljava/lang/String;)V

WAR归档文件只包含压缩的zip文件。您可以使用WinRar(Windows)或unzip(Linux)等任何工具对其进行解压缩或任何您喜欢的工具。解压缩后,您将获得存档的目录和文件。在其中,您将找到您使用的所有附加库和类文件,以及静态内容。

Import语句是仅编译时机制。它们不是编译字节码的一部分。您可以尝试打开war和反编译.class文件。但是,正如您所指出的,“降级”java或将javafx添加到tomcat应该可以解决问题,而无需检查文件。@LucasCampos正如@Seelenvirtuose所指出的,javap不是反编译的工具。是否有任何官方工具可以进行反编译?运行
javap-v-constants
在.class文件上查看类引用。您可能希望通过
grep“=class”
(Linux)或
findstr”=\class”
(Windows),或者可能只是
grep javafx
/
findstr javafx
。对于那些不耐烦的人:find.-name'*.class'| xargs-i sh-c'echo'{}:$(javap-v-constants'{}'| grep“=Class”)| grep javafx