尝试加载HttpUriRequest时Websphere上的java.lang.LinkageError
我的项目使用CUPS4J,它依赖于http客户端、http核心和slf4j 为了解决依赖关系,我们使用Maven,我定义了如下依赖关系:尝试加载HttpUriRequest时Websphere上的java.lang.LinkageError,java,maven,websphere,linkageerror,Java,Maven,Websphere,Linkageerror,我的项目使用CUPS4J,它依赖于http客户端、http核心和slf4j 为了解决依赖关系,我们使用Maven,我定义了如下依赖关系: <dependency> <groupId>cups4j</groupId> <artifactId>cups4j</artifactId> <version>0.6.4</version> </dependency> <depend
<dependency>
<groupId>cups4j</groupId>
<artifactId>cups4j</artifactId>
<version>0.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
这是打印PDF的方法(在it.dropcomp.tasks.print.PrinterService
中):
似乎HttpUriRequest
已经存在,并且与Apache中的httpclient
库提供的请求冲突,但是如果我尝试从pom.xml
中删除该依赖项,我会得到该类的NoClassDefFoundException
如果重要的话,我的IDE是Eclipse Luna
如何解决此异常?WebSphere还使用httpclient库,这可能与您提供的库冲突。
尝试通过
环境>共享库
在管理控制台中创建独立的共享库。将http-*
、slf4j
和cups4j
jar放在那里,并将该共享库与您的应用程序关联起来。不幸的是,我不能。我必须使用Maven来解决依赖关系,我在一个团队中工作,团队负责人希望这样做。我读到我可以告诉maven提供了这个库,这样当应用程序部署到服务器上时,它就不包括jar了。我会尝试这种方法,也许它能解决问题。谢谢大家!@反斜杠您仍然可以使用maven构建
,这没有问题,但正如您编写的那样,您需要将这些依赖项标记为提供的,并且不包括在应用程序中,但不幸的是,在应用程序服务器上将其配置为库。您可以尝试将应用程序设置中的classloader更改为Parent Last,但这并不能解决您的问题。
Caused by: java.lang.LinkageError: loader constraint violation: loader "org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader@208c132" previously initiated loading for a different type with name "org/apache/http/client/methods/HttpUriRequest" defined by loader "com/ibm/ws/classloader/CompoundClassLoader@1e0f797"
at java.lang.ClassLoader.defineClassImpl(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:260)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:580)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:550)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:481)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassName(ClasspathManager.java:460)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:447)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:393)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:469)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(ClassLoader.java:612)
at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:584)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:708)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:700)
at org.cups4j.operations.IppOperation.sendRequest(IppOperation.java:207)
at org.cups4j.operations.IppOperation.request(IppOperation.java:76)
at org.cups4j.CupsPrinter.print(CupsPrinter.java:113)
at it.dropcomp.tasks.print.PrinterService.printPDF(PrinterService.java:160)
public void printPDF() throws RemoteServiceException {
/*
* generatedPDF is defined as File, and it's properly initialized
* before calling this method.
*/
if(generatedPDF == null) {
throw new RemoteServiceException("You must generate a file first!");
}
try {
CupsPrinter selectedPrinter = new CupsPrinter(
new URL(Constants.PRINTER_FULL_URL),
Constants.PRINTER_NAME, true
);
InputStream is = new FileInputStream(generatedPDF);
PrintJob pj = new PrintJob.Builder(is).build();
selectedPrinter.print(pj); //this is line 160
} catch (Exception e) {
LOG.error("Exception", e);
throw new RemoteServiceException(e);
}
}