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



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

它确实和tomcat 8一起在那里运行,没有任何问题。

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

。。。还有10个原因:java.lang.ClassNotFoundException:javafx.scene.image.image位于org.apache.catalina.loarder.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1358(在org.apache.catalina.loarder.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"程序也使用多个类。

public class Test {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

输出

C:pathtoclassesclasses>javap -v -constants Test.class | grep "= Class"
#1 = Class              #2             // Test
#3 = Class              #4             // java/lang/Object
#17 = Class              #18            // java/lang/System
#25 = Class              #26            // java/io/PrintStream

它没有显示String的使用。要了解原因,请查看完整的常量池,对于这个小程序来说,它是:

Constant pool:
#1 = Class              #2             // Test
#2 = Utf8               Test
#3 = Class              #4             // java/lang/Object
#4 = Utf8               java/lang/Object
#5 = Utf8               <init>
#6 = Utf8               ()V
#7 = Utf8               Code
#8 = Methodref          #3.#9          // java/lang/Object."<init>":()V
#9 = NameAndType        #5:#6          // "<init>":()V
#10 = Utf8               LineNumberTable
#11 = Utf8               LocalVariableTable
#12 = Utf8               this
#13 = Utf8               LTest;
#14 = Utf8               main
#15 = Utf8               ([Ljava/lang/String;)V
#16 = Fieldref           #17.#19        // java/lang/System.out:Ljava/io/PrintStream;
#17 = Class              #18            // java/lang/System
#18 = Utf8               java/lang/System
#19 = NameAndType        #20:#21        // out:Ljava/io/PrintStream;
#20 = Utf8               out
#21 = Utf8               Ljava/io/PrintStream;
#22 = String             #23            // Hello World
#23 = Utf8               Hello World
#24 = Methodref          #25.#27        // java/io/PrintStream.println:(Ljava/lang/String;)V
#25 = Class              #26            // java/io/PrintStream
#26 = Utf8               java/io/PrintStream
#27 = NameAndType        #28:#29        // println:(Ljava/lang/String;)V
#28 = Utf8               println
#29 = Utf8               (Ljava/lang/String;)V
#30 = Utf8               args
#31 = Utf8               [Ljava/lang/String;
#32 = Utf8               SourceFile
#33 = Utf8               Test.java

由于您不需要所有的字符串常量,因此可以使用grep -v Utf8:

#1 = Class              #2             // Test
#3 = Class              #4             // java/lang/Object
#8 = Methodref          #3.#9          // java/lang/Object."<init>":()V
#9 = NameAndType        #5:#6          // "<init>":()V
#16 = Fieldref           #17.#19        // java/lang/System.out:Ljava/io/PrintStream;
#17 = Class              #18            // java/lang/System
#19 = NameAndType        #20:#21        // out:Ljava/io/PrintStream;
#22 = String             #23            // Hello World
#24 = Methodref          #25.#27        // java/io/PrintStream.println:(Ljava/lang/String;)V
#25 = Class              #26            // java/io/PrintStream
#27 = NameAndType        #28:#29        // println:(Ljava/lang/String;)V

WAR档案是有注释的压缩zip文件。您可以使用任何工具提取它们,如WinRar(在Windows中(或unzip(在Linux中(或任何您喜欢的工具。提取后,您将获得存档的目录和文件。在其中,您将找到您使用的所有附加库和类文件,以及静态内容。

相关内容

  • 没有找到相关文章

最新更新