假设我在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,只包含我使用的类及其依赖项?
答案 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会自动为你找出答案。