Is it possible to include only the used classes in a war file with maven build?

岁酱吖の 提交于 2021-02-05 06:37:05

问题


Say I have this dependency in my pom.xml file:

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

When I do a

clean install

all the javaee-api-6.0.jar will be included in the war file under WEB-INF\lib folder.

Is it possible that instead of including the whole jar, only classes that I use and their dependencies are included?


回答1:


If you're deploying into a Java EE application server, that entire JAR is already provided by the application server, and can be omitted from the WAR file. You can accomplish this by putting it into the provided scope:

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

That makes that dependency available for compilation and test execution, but will not package it into the WAR.

In contrast, trying to determine which individual classes you need so you can only include their class files is an ultimately pointless endeveor. The JVM only loads classes when they are used - that is, unused classes are not loaded.

It is generally impossible to identify the used classes at compile time due to reflection. For instance, consider:

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

You can get the JVM to log which classes are loaded, but different executions can use different classes ...




回答2:


It's not a viable option - at least not in maven, although You know which classes You are using, but You don't know what are the dependencies for each class that You imported - so it might be impossible satisfy it's requirements. This is why we are using tools like maven - to ease the process importing a library.

Read some more about reduce size of built project and see what are Your options there

Except for UberJAR, Your biggest chance (IMHO) would be to identify libraries that are provided by the container, and use provided scope for them.

You also could integrate 3rd party tools like ProGuard




回答3:


You could use exclusions.

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

But I don't think you could exclude at class-levels. This only excludes dependencies useful when there are conflicting dependencies in your project.




回答4:


It is really not a viable option in my opinion ,as its almost impossible to know internals what all classes are required at runtime until and unless you are seeing the,implementation of all the,3rd part apis that you are using.

I also think the whole idea behind the maven is to ease the development and build process so that you won't have to do any effort in identifying the artifacts that are required at runtime or compile time. Maven will automatically figure out that for you.



来源:https://stackoverflow.com/questions/22884795/is-it-possible-to-include-only-the-used-classes-in-a-war-file-with-maven-build

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!