如何在运行时使用maven找出哪个jar文件提供了一个类?

时间:2009-11-11 16:20:57

标签: maven-2

我使用mvn jetty运行我的应用程序:运行

在编译时一切都很好,我的行

  Tidy tidier = new Tidy();
    tidier.setInputEncoding("UTF-8");

编译好,类路径显示适当的jar。但是,在运行时我得到以下异常,我无法理解为什么:

2009-11-11 17:48:53.384::WARN:  Error starting handlers
java.lang.NoSuchMethodError: org.w3c.tidy.Tidy.setInputEncoding(Ljava/lang/String;)V

我现在想也许在我的类路径中有两个不同版本的这个Tidy(一个显然不是名字整齐,否则我可以在maven所示的类路径中检测到它)。我试图找出它是什么jar文件,到目前为止我已经尝试了以下内容:

Class<?> tidyClass = Class.forName(Tidy.class.getName());
ClassLoader tidyLoader = tidyClass.getClassLoader();
String name = Tidy.class.getName() + ".class"; // results in tidyClass=class org.w3c.tidy.Tidy
System.out.println("resource="+tidyLoader.getResource(name)); // results in tidyLoader=org.codehaus.classworlds.RealmClassLoader@337d0f
System.out.println("path="+tidyLoader.getResource(name).getPath()); // results in resource=null

我在某处看到路径应该显示jar但显然没有这个类加载器......我怎么能弄明白呢?一切都像日食中的魅力一样,但当我和maven一起跑的时候,我得到了这个烂摊子.BTW eclipse说

tidyClass=class org.w3c.tidy.Tidy
tidyLoader=sun.misc.Launcher$AppClassLoader@1a7bf11
resource=null so no jar info either.

1 个答案:

答案 0 :(得分:6)

尝试这样的事情:

    Class clazz = null;
    try {
        clazz = Class.forName( typeName );
        if ( clazz != null && clazz.getProtectionDomain() != null
                && clazz.getProtectionDomain().getCodeSource() != null )
        {
            URL codeLocation = clazz.getProtectionDomain().getCodeSource()
                    .getLocation();
            System.out.println( codeLocation.toString() );
        }
    }
    catch ( ClassNotFoundException e ) {
        System.out.println( e.getMessage() );
    }

其中typeName =“org.w3c.tidy.Tidy”。