java - 是否可以在使用 Maven 构建的 War 文件中仅包含使用过的类?

标签 java maven

假设我的 pom.xml 文件中有此依赖项:

  <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
  </dependency>

当我做

clean install

所有的javaee-api-6.0.jar都将包含在WEB-INF\lib文件夹下的war文件中。

是否有可能只包含我使用的类及其依赖项,而不是包含整个 jar?

最佳答案

如果您要部署到 Java EE 应用程序服务器中,则应用程序服务器已提供整个 JAR,并且可以从 WAR 文件中省略。您可以通过将其放入提供的范围来完成此操作:

  <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
  </dependency>

这使得该依赖项可用于编译和测试执行,但不会将其打包到 WAR 中。

相比之下,尝试确定您需要哪些单独的类,以便只能包含它们的类文件,这最终是毫无意义的。 JVM 仅在使用类时加载它们 - 也就是说,不会加载未使用的类。

由于反射,通常无法在编译时识别所使用的类。例如,考虑:

System.console().printf("Please specify the implementation class to use");
String className = System.console().readLine();
FooService service = (FooService) Class.forName(className).newInstance();
service.work();

您可以让 JVM 记录加载了哪些类,但不同的执行可以使用不同的类...

关于java - 是否可以在使用 Maven 构建的 War 文件中仅包含使用过的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884795/

相关文章:

java - 读取文件夹中的整个文件

java - 如何使用断言命令?

java - Maven 编译时抛出 IllegalCharsetNameException

java - 保存时构建和部署

java - Spring找不到类路径中存在的类

java - 在java中计算平均值

java - 使用 Spring Data 时避免读取-修改-写入反模式的方法?

java - spring boot如何在目标中创建jar文件而无需在pom中添加插件

maven - 如果任何人都可以创建和上传任何 key ,那么 maven 的 OpenPGP 签名有什么意义?

java - 对 CPU 使用率非常高的 Java 进程进行故障排除 - Tomcat 应用程序