2014-11-06 99 views
2

我使用的CUPS4J用於我的項目,該項目取決於http-client,http-core和slf4j。Websphere上的java.lang.LinkageError嘗試加載HttpUriRequest

要解決我們使用Maven的依賴,和我已經定義的依賴關係如下:

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

的cups4j依賴是我們artifactory的服務器上(我不能在網上找到它)。

如果我創建一個樣本main方法來打印某些文檔並將其作爲Java應用程序啓動,那麼所有內容都可以作爲魅力使用。

當我發表我的班到WebSphere服務器,並調用該方法從一個網頁,它會生成一個java.lang.LinkageError

這是堆棧跟蹤的相關部分:

Caused by: java.lang.LinkageError: loader constraint violation: loader "org/eclipse/osgi/internal/baseadaptor/[email protected]" previously initiated loading for a different type with name "org/apache/http/client/methods/HttpUriRequest" defined by loader "com/ibm/ws/classloader/[email protected]" 
    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) 

這是打印PDF(內部it.dropcomp.tasks.print.PrinterService)的方法:

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); 
    } 
} 

似乎HttpUriRequest已經存在,使得衝突一個由Apache的httpclient庫提供,但如果我嘗試從pom.xml去除依賴,我得到了NoClassDefFoundException該類。

如果很重要,我的IDE是Eclipse Luna。

我該如何解決這個異常?

回答

0

WebSphere還使用httpclient庫,它可能與您提供的庫衝突。 嘗試通過Environment > Shared Libraries在管理控制檯中創建獨立的共享庫。將http-*,slf4jcups4j放置在那裏,並將共享庫與您的應用程序相關聯。

+0

不幸的是,我不能。我必須使用Maven來解決依賴關係,我在一個團隊中工作,團隊領導希望這樣做。我讀過,我可以告訴Maven該庫已提供,以便在應用程序部署到服務器上時不包含jar。我會嘗試這種方法,也許它解決了這個問題。謝謝! – BackSlash 2014-11-07 08:26:45

+0

@BackSlash您仍然可以'build'與Maven,有與沒有問題,但你寫的,你需要標記這些依賴關係,並提供在應用程序中不包括,但不幸的是,應用服務器庫上對其進行配置。您可以嘗試改變只是類加載器的應用程序設置於母公司最後,但它,而不是要去解決您的問題。 – Gas 2014-11-07 08:57:30

相關問題