【问题标题】:Is it possible to include only the used classes in a war file with maven build?是否可以在带有 maven 构建的 war 文件中仅包含使用的类?
【发布时间】:2014-04-05 18:14:06
【问题描述】:

假设我的 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?

【问题讨论】:

  • 你为什么要这么做?
  • @meriton 让我的战争文件更小。
  • 为什么你的war文件大小有问题?磁盘空间很便宜...
  • @meriton 我只是想..

标签: java maven


【解决方案1】:

如果您要部署到 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记录加载了哪些类,但是不同的执行可以使用不同的类...

【讨论】:

    【解决方案2】:

    这不是一个可行的选择——至少在 Maven 中不是,虽然你知道你正在使用哪些类,但是你不知道你导入的每个类的依赖项是什么——所以它可能无法满足它的要求。这就是为什么我们使用 maven 之类的工具来简化导入库的过程。

    阅读更多关于reduce size of built project 的信息,看看你有哪些选择

    除了 UberJAR,您最大的机会(恕我直言)是识别容器提供的库,并为它们使用 provided 范围。

    您还可以集成 3rd 方工具,例如 ProGuard

    【讨论】:

      【解决方案3】:

      你可以使用exclusions

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

      但我认为您不能在班级级别排除。这仅排除在项目中存在冲突依赖项时有用的依赖项。

      【讨论】:

        【解决方案4】:

        在我看来,这确实不是一个可行的选择,因为几乎不可能知道内部在运行时需要什么所有类,除非你看到你正在使用的所有第三部分 api 的实现。

        我还认为 maven 背后的整个想法是简化开发和构建过程,这样您就不必费力地识别运行时或编译时所需的工件。 Maven 会自动为您找出答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-17
          • 1970-01-01
          • 1970-01-01
          • 2013-11-17
          • 2018-11-15
          • 2015-01-28
          相关资源
          最近更新 更多