ChatGPT解决这个技术问题 Extra ChatGPT

Is there a simple way to remove unused dependencies from a maven pom.xml?

I have a large Maven project with many modules and many pom.xml files. The project has changed and I suspect the pom's contain some unnecessary dependencies. Is there is a command which removes any unused dependencies from a pom?

If you're using IntelliJ, see this : jonnyzzz.com/blog/2013/05/13/… In case of dead link : Jonnyzzz Dependencies plugin
@Benj I tried to use this jonnyzz plugin, and it was useless. Most of the time it won't find any unused dependencies, and sometimes when it does it would remove the dependencies from class path not from build.gradle file. I can't even find proper doc to explain how does this plugin actually work.
@vaibhav.g thanks for the update. It seems things did change since 2016 then.

P
Pascal Thivent

The Maven Dependency Plugin will help, especially the dependency:analyze goal:

dependency:analyze analyzes the dependencies of this project and determines which are: used and declared; used and undeclared; unused and declared.

Another thing that might help to do some cleanup is the Dependency Convergence report from the Maven Project Info Reports Plugin.


How can I trigger this in Eclipse?
Be carefull with dependency:analyze, some libraries used at runtime are considered as unused.
To prevent reporting the runtime and provided dependencies as unused, the ignoreNonCompile option can be set to true.
be carefull while using dependency:analyze, even i was using 'ejp api3'depedency but the report shown it was 'unused and declared'
To understand the results of analysis, see this answer: "Used undeclared dependencies are those which are required, but have not been explicitly declared as dependencies in your project." - stackoverflow.com/questions/4565740/…
S
Saikat

You can use dependency:analyze -DignoreNonCompile

This will print a list of used undeclared and unused declared dependencies (while ignoring runtime/provided/test/system scopes for unused dependency analysis.)

## Be careful while using this, some libraries used at runtime are considered unused

For more details refer to this link


[plus] 1 for the runtime mention!
You're right some runtime dependencies are decleared as unused but in fact needed.
helpful but still not 100% correct. I could see some dependencies used by Groovy but still listed.
R
Rich Seller

As others have said, you can use the dependency:analyze goal to find which dependencies are used and declared, used and undeclared, or unused and declared. You may also find dependency:analyze-dep-mgt useful to look for mismatches in your dependencyManagement section.

You can simply remove unwanted direct dependencies from your POM, but if they are introduced by third-party jars, you can use the <exclusions> tags in a dependency to exclude the third-party jars (see the section titled Dependency Exclusions for details and some discussion). Here is an example excluding commons-logging from the Spring dependency:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring</artifactId>
  <version>2.5.5</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions> 
</dependency>

(IntelliJ) I used the Jonnyzzz plugin, as commented to the question. Nice plugin, works well with IntelliJ 2016.1.3
B
Brian Agnew

Have you looked at the Maven Dependency Plugin ? That won't remove stuff for you but has tools to allow you to do the analysis yourself. I'm thinking particularly of

mvn dependency:tree

Excellent - thanks (couldn't find what I was looking for as I kept searching for "clean dependencies" and it was throwing up the clean plugin!! but this looks promising.. mvn dependency:analyze)
u
user1132305

I had similar kind of problem and decided to write a script that removes dependencies for me. Using that I got over half of the dependencies away rather easily.

http://samulisiivonen.blogspot.com/2012/01/cleanin-up-maven-dependencies.html


Note, this script do not use mvn dependency:analyze. It just tries to remove every dependency and checks if mvn install works.
M
Martin Monperrus

You can use DepClean https://github.com/castor-software/depclean/

DepClean is a tool to automatically remove dependencies that are included in your Java dependency tree but are not actually used in the project's code.


U
Usman Mohyuddin

If you are using eclipse, right-click on the jar in Maven Dependencies: Select Maven -> Exclude Maven Artifact...


Obviously this doesn't do what we are looking for...