问题
Does anyone have code to detect duplicate JARs in the classpath?
Background: When there are two versions of the same JAR in the classpath, really strange things can happen. This can even happen when using tools like Maven: Change a dependency and build the WAR without cleaning first. Since target/webapp/WEB-INF/lib
wasn't cleaned, the dependency will be in there twice.
Is there a safety-net for this?
回答1:
JBoss Tattletale might help you with this.
It's a free tool which scans the JAR files used by your project and gives you a report about them.
Amongst its feature are:
- Spot if a class is located in multiple JAR files
- Spot if the same JAR file is located in multiple locations
- Find similar JAR files that have different version numbers
回答2:
There is a Maven plugin to do just that: maven-duplicate-finder-plugin
[EDIT] If you want to do it in unit tests yourself, use
getClass().getClassLoader().getResources( "com/pany/package/Java.class" )
If this returns more than one URL
, you have duplicates on the classpath.
The drawback is that this only works for cases where you had conflicts in the past. On the positive side, it's just a few lines of code (or one line when you write a helper method) and it works on your build server.
回答3:
System.getProperty("java.class.path")
, split it, sort it, look at it with the human eye
:-).
It will not include the classpath derived from manifests inside other jars thou :-(.
Or use http://www.jboss.org/tattletale as one of the posters suggested.
回答4:
I think the simplest way is to simply trash the target directory first. Hopefully copying all the .jar files in isn't going to be time-consuming.
Otherwise you're going to have to somehow compare sizable files (whether directly, via computed checksum or similar). Which doesn't sound very nice at all.
回答5:
You can write a simple script to compare the md5 sum of every jar file to every other jar file and deleting duplicates along the way.
来源:https://stackoverflow.com/questions/878003/how-to-detect-duplicate-jars-in-the-classpath