【问题标题】:java.lang.LinkageError on Websphere while trying to load HttpUriRequest尝试加载 HttpUriRequest 时 Websphere 上的 java.lang.LinkageError
【发布时间】:2014-11-06 10:08:00
【问题描述】:

我的项目使用 CUPS4J,它依赖于 http-client、http-core 和 slf4j。

为了解决依赖关系,我们使用 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/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)

这是打印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。

我该如何解决这个异常?

【问题讨论】:

    标签: java maven websphere linkageerror


    【解决方案1】:

    WebSphere 还使用 httpclient 库,它可能与您提供的库发生冲突。 尝试通过Environment &gt; Shared Libraries 在管理控制台中创建隔离的共享库。将http-*slf4jcups4j jar 放在那里,并将该共享库与您的应用程序相关联。

    【讨论】:

    • 不幸的是,我不能。我必须使用 Maven 来解决依赖关系,我在一个团队中工作,团队负责人希望以这种方式完成。我读到我可以告诉 maven 提供了该库,因此当应用程序部署在服务器上时它不包含 jar。我会尝试这种方法,也许它可以解决问题。谢谢!
    • @BackSlash 你仍然可以build 使用maven,这没有问题,但是正如你所写,你需要将这些依赖项标记为已提供并且不包含在应用程序中,但不幸的是配置它在应用程序服务器上作为库。您可以尝试仅将应用程序设置中的类加载器更改为 Parent Last,但这并不能解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2011-03-19
    • 1970-01-01
    • 2014-08-16
    • 2020-08-23
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多