Как узнать, какой jar-файл предоставляет класс во время выполнения, используя maven? - PullRequest
2 голосов
/ 11 ноября 2009

Я запускаю свое приложение, используя mvn jetty: run

Во время компиляции все хорошо, мой ряд

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

компилируется нормально, а путь к классам показывает соответствующий файл. Однако во время выполнения я получаю следующее исключение и не могу понять, почему:

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

Теперь я думаю, что, может быть, в моем классе есть две разные версии этой Tidy (одна, очевидно, не называется tidy, в противном случае я мог бы обнаружить ее в classpath, показанном 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

Я где-то читал, что путь должен показывать банку, но, видимо, не с этим загрузчиком классов ... как я могу это выяснить? В затмении все работает как талисман, но когда я бегу с maven, я получаю этот беспорядок ... Кстати, затмение говорит

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

1 Ответ

6 голосов
/ 11 ноября 2009

попробуйте что-то вроде этого:

    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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...