是否可以仅在maven构建的war文件中包含已使用的类?

时间:2014-04-05 18:14:07

标签: 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,只包含我使用的类及其依赖项?

4 个答案:

答案 0 :(得分:2)

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

详细了解reduce size of built project,了解您的选择

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

您还可以集成第三方工具,例如ProGuard

答案 1 :(得分: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 :(得分:0)

您可以使用exclusions

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

但我认为你不能在课堂上排除。这只会排除在项目中存在冲突的依赖项时有用的依赖项。

答案 3 :(得分:0)

在我看来,它实际上不是一个可行的选项,因为几乎不可能知道内部所有类在运行时需要什么,除非你看到你正在使用的所有第三部分apis的实现。< / p>

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