【问题标题】:Trying to reference an external jar through another external jar - httpcore through httpclient尝试通过另一个外部 jar 引用外部 jar - httpcore 通过 httpclient
【发布时间】:2013-11-15 19:18:22
【问题描述】:

在 Eclipse 中运行 junit 时,一切正常。当我将我的 jar 部署到 Oracle Serviec Bus 并通过代理调用它时,我遇到了问题。

我的jar使用了httpClient & httpCore,httpClient也对httpCore有一些依赖。当 httpclient 引用 httpcore 而没有从我的 jar 中引用时,就会出现问题。我已经证明这是通过编辑 httpclient 的清单以拥有 httpcore jar 来引用另一个的外部 jar。如果我这样做,所有工作都可以,但我不想像你期望的那样手动编辑外部 jar!

我的清单有这个类路径集: 类路径:httpcore-4.3.jar httpclient-4.3.1.jar DatabaseUtil-1.0.jar commons-codec-1.8.jar

我正在努力将 jars 添加到服务器的类路径中,我认为这会起作用,但检查是否有另一种方法可以做到这一点,因为有其他服务/jars 使用相同的 jvm。我在下面复制了一个测试类来显示问题的证明

非常感谢任何帮助。

谢谢, 丹尼尔。

public class CheckHTTPJars {

  public static String checkHttpJarsLoaded()
  {

    try {
        System.out.println("Starting...");
        System.out.println("classpath: " + System.getProperty("java.class.path"));

        HttpHost host = new HttpHost("test");

        System.out.println("Hit HTTPCore... ");

        BasicResponseHandler b = new BasicResponseHandler();

        System.out.println("Hit HTTPClient... ");

        HttpGet get = new HttpGet();

        System.out.println("Hit HTTPClient but referencing HttpCore... ");

        HttpRequest h = null;

        System.out.println("Hit HTTPCore... ");


        return("Passed");
    } catch (Exception e) {
        return (e.getMessage());
    }

  } 
}

【问题讨论】:

    标签: java jar classpath osb


    【解决方案1】:
    1. 您是否在使用 OSB java callout 活动?

    2. 您是否得到找不到类(或其他异常)?

    3. DatabaseUtil-1.0.jar 是什么,是你自己制作并用于标注的吗?

    我假设在这个答案中对这些问题的回答是正确的。

    您需要两个(未修改的)jar 才能使您的代码正常工作。

    如果您不想将两个 jar 放在服务器类路径中(Oracle 推荐用于常见工件),您可以将它们与标注中使用的自定义 jar 捆绑在一起。这可能没问题(取决于用例),因为两个 jar 总共约为 1MB。见How can I create an executable JAR with dependencies using Maven?

    请记住,您需要 commons-codec 和这两者的其他一些依赖项,请查看 http://mvnrepository.com/ 以获取完整列表。

    【讨论】:

    • 您好,感谢您的回复。我正在使用 OSB Java 标注,错误是 java.lang.NoClassDefFoundError:org/apache/http/HttpHost。 DatabaseUtil 是我自己用于调用 DB 的实用程序。我已经通过清单提供了这个并且正在工作。我有两个罐子,我会考虑将它们与 maven 捆绑在一起。我们目前正在使用 ant 来构建这个项目,但应该可以更改为 maven 项目。
    【解决方案2】:

    最后我坚持使用 Ant 并使用 zipgroupfileset 标签。这会将外部 jar 类捆绑到您的 jar 中。这有点混乱,因为它正在提取类并将它们复制到您的 jar 中,而不是将 jar 捆绑在其中。我确信有一种方法可以捆绑 jar,并且可能来自 arkonautom 的 maven 解决方案(顺便谢谢)将为你做这个(我没时间了,所以从来没有尝试过)。

    我想到的其他解决方案 - 将 jar 复制到 $domain/lib 文件夹。这也有效,但发现我也必须将 jar 部署到文件夹中,否则我的 java 调出没有看到代码时遇到问题。我没有花时间调查 - 使用 java.net URLConnection 重写了代码。这也有效,但在本地运行时遇到授权问题,因此最终决定反对。

    希望这对其他人有所帮助...

            <zipgroupfileset dir="lib">
                  <include name="httpclient-4.3.1.jar"/>
                  <include name="httpcore-4.3.jar"/>
                  <include name="commons-codec-1.8.jar"/>
            </zipgroupfileset> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2021-01-22
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多