xenoterracide
xenoterracide

Reputation: 16865

Is there a way to find out which maven artifact a class is in?

I'm trying to upgrade our Spring version and use Spring IO Platform BOM to do so, but a few of our classes have gone missing (moved into other artifacts) or are no longer dependencies of some thing I was pulling in. I'm trying to find out which package they were originally part of (one example is CSVStrategy ). Some of these dependencies such as WhitespaceTokenizer have over a dozen artifact names that could be supplying it, and in order to find the correct upgrade path I need to figure out where it's currently coming from.

Upvotes: 5

Views: 3209

Answers (2)

user944849
user944849

Reputation: 14961

I have used JBoss Tattletale for this type of task in the past. I don't think it's being actively maintained any longer, however it still works for me. Here's the config I use. Note, I had to add this to my POM's build section, even though the goal 'report' seems to imply it is a report plugin.

<plugin>
  <groupId>org.jboss.tattletale</groupId>
  <artifactId>tattletale-maven</artifactId>
  <!-- The version of the plugin you want to use -->
  <version>1.2.0.Beta2</version>
  <executions>
    <execution>
      <goals>
        <goal>report</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
  <!-- This is the location which will be scanned for generating tattletale reports -->
    <source>${project.build.directory}/${project.artifactId}/WEB-INF/lib</source>
    <!-- This is where the reports will be generated -->
    <destination>${project.build.directory}/site/tattletale</destination>
  </configuration>
</plugin>

You could also try jHades. I haven't had a chance to use it yet, it is on my list of things to investigate.

Upvotes: 0

Martin Frey
Martin Frey

Reputation: 10075

One possible way could be to get the resource (class) location. If the class comes from a jar file you would at least get the jar name. From that you should be able to identify the maven artifact.

someClass.getProtectionDomain().getCodeSource().getLocation().toURI();

Or with a ResourceLoader and a logger you could print a list of all classes on the classpath / servlet-path.

@Autowired 
ResourceLoader resourceLoader;

public void printResourceLocations() {
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(resourceLoader);
    Resource[] resources = resolver.getResources("classpath*:com/**/*.class"));
    for (Resource resource : resources) {
        log.info(resource.getURI()); 
        // Not sure if that works, probably getFile() is ok?
    }
}    

Upvotes: 1

Related Questions