gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:42:23 29 4
gpt4 key购买 nike

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

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

  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(显然没有命名为 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,但显然不是使用这个类加载器......我怎样才能弄清楚?一切都像 Eclipse 中的魅力一样工作,但是当我使用 Maven 运行时,我得到了这个困惑。顺便说一句 Eclipse 说

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

最佳答案

尝试这样的事情:

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

关于maven-2 - 如何使用maven在运行时找出哪个jar文件提供了一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716290/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com