有没有一种方法可以确定正在运行的项目是 .war 文件还是 .jar 文件?

3

有没有一种方法可以检查当前正在运行的项目是 .jar 文件还是 .war 文件?我试图获取类路径,但它显然会根据是否是 .war 文件而有所不同。

String classPath = new File(Class.class.getProtectionDomain().getCodeSource().getLocation()
                            .toURI()).getPath();
1个回答

3
有没有办法确定一个正在运行的项目是 .war 文件还是 .jar 文件?
我认为答案是“没有”。
首先……什么意思是“运行一个 .war”?
Java SE默认情况下不理解WAR文件。例如,java -cp my.war ... 是不起作用的。WAR文件是Java EE的一部分。
同样,一个默认的Java EE (或Jakarta EE) web容器也不能运行一个具有public static void main(String[])入口点的普通JAR文件。
在典型的Java EE容器中,您不会直接“运行” WAR 文件。相反,您通常会将其部署到Java EE容器(例如Tomcat、Websphere等)中。然后,容器将把WAR解压缩到一个目录中,并使用类加载器从该目录中读取JAR文件和.class文件来运行Web应用程序。
(这就是为什么您问题中的代码可能无法工作的原因。Web应用程序类路径上的资源可能不会有war: URI。他们将有jar: 或file: URIs……引用未打包的WAR内容。)
但是,即使您称之为“运行 WAR 文件”,仍然存在一个问题,即在Tomcat中,您可以配置IDE以直接填充Web应用程序目录,避免创建WAR文件的需要。或者(颤抖!)您可以直接在Tomcat webapp目录中进行开发。
据我所知,Web应用程序无法区分这两种部署模式,因此不能确定它是否正在使用JAR文件或WAR文件运行。
另一方面,Java应用程序(或库)可能可以确定它是否在Java EE(或Jakarta EE)容器中运行。如果是,则将能够(例如)使用反射加载Servlet类。
如果我们谈论支持运行JAR和基于WAR的应用程序的特定框架(例如Spring Boot),则应用程序可能能够使用该框架的功能来区分这两种情况。(但可能没有什么用处……)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接