当前位置: 首页 > 知识库问答 >
问题:

在jetty运行的web项目中使用HttpClient时,我遇到了一个InvocationTargetException

瞿宏儒
2023-03-14

我使用HttpClient制作了一个util类,用于在web项目中通过http协议获取数据。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.3</version>
</dependency>

我的util类的方法在这个项目中的一个单元测试方法中工作得很好。但是,当我开始通过jetty运行项目时,调用util类的相同方法时,会有一个用于执行以下语句的InvocationTargetException:

CloseableHttpClient httpClient = HttpClients.createDefault(); 

更多详情:

loader constraint violation: loader (instance of org/mortbay/jetty/webapp/WebAppClassLoader) previously initiated loading for a different type with name "javax/net/ssl/SSLSocketFactory"

java.lang.LinkageError: loader constraint violation: loader (instance of org/mortbay/jetty/webapp/WebAppClassLoader) previously initiated loading for a different type with name "javax/net/ssl/SSLSocketFactory"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:294)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:261)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
at com.qunar.mobile.touch2.utils.http.Touch2HttpClient.doGet(Touch2HttpClient.java:36)
at com.qunar.mobile.touch2.utils.http.Touch2HttpClient.doGet(Touch2HttpClient.java:75)
at com.qunar.mobile.touch2.utils.http.Touch2HttpClient.doGet(Touch2HttpClient.java:83)
at com.qunar.mobile.touch2.service.hotel.activity.PizzaHutBreakfastService.queryCoupon(PizzaHutBreakfastService.java:21)
at com.qunar.mobile.touch2.controller.hotel.activity.PizzaHutBreakfast.execute(PizzaHutBreakfast.java:42)
at com.qunar.mobile.touch2.core.DispatcherServlet.doGet(DispatcherServlet.java:77)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.qunar.mobile.touchwap.filter.SecurityFilter.doFilter(SecurityFilter.java:36)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at qunar.management.HandlerContainer.handle(HandlerContainer.java:43)
at qunar.ServletWatcher.doFilter(ServletWatcher.java:90)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

使用jetty的Maven构建配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.10</version>
            <configuration>
                <webAppConfig>
                    <contextPath>/</contextPath>
                </webAppConfig>
                <scanIntervalSeconds>10</scanIntervalSeconds>
                <stopKey>foo</stopKey>
                <stopPort>9999</stopPort>
            </configuration>
            <executions>
                <execution>
                    <id>start-jetty</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <scanIntervalSeconds>0</scanIntervalSeconds>
                        <daemon>true</daemon>
                    </configuration>
                </execution>
                <execution>
                    <id>stop-jetty</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我使用JDK1.7

我应该怎么做才能使我的util方法在这个web项目中很好地工作呢?

------------更新-------------------

我刚试着把HttpClient的版本改成4.3,现在一切都好了,jdk、jetty和HttpClient的版本之间似乎存在着一种神秘的效果。

虽然这个util方法现在可以工作了,但我还是想知道为什么会抛出这个异常,以及如果我还想使用HttpClient4.5.1,我应该怎么做。

共有1个答案

黄弘盛
2023-03-14

Jetty 6.1.10是EOL(寿命结束)。

到今天为止,stable Jetty已经发布了181个版本。

当项目转移到Eclipse foundation并且Jetty7.0被旋转时,对此的修复被引入到修复WebAppClassLoader的Jetty7.0.x(Beta/Milestone)代码库中。(javax.*类是从服务器类加载器强制加载的,不允许它们进入您的加载器约束场景)

升级jetty-eclipse.org/Jetty的版本

 类似资料:
  • 使用此命令运行我的项目时遇到以下错误:mvn -e camel:run [错误]无法执行目标org.apache.camel:camel-maven-plugin:2.10.4:运行(default-cli)项目废话:nul l:MojoExecutionException:org.apache.camel.spring.Main- 以下是我在 pom.xml 文件中的依赖项: 删除作用域后出错。

  • 失败:生成失败,出现异常。 问题:配置根项目“android”时出现问题 无法解析配置“classpath”的所有项目。找不到组织。喷气式飞机。kotlin:kotlin gradl电子插件:1.3.50。在以下位置搜索:-https://dl.google.com/dl/android/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.3.50

  • 我正在使用Java1.9和Eclipse Oxygo,当我试图导出可运行的JAR文件时,它会说JAR创建错误。当我看到详细信息时,它告诉我“无法从给定的启动配置中找到main方法”。我已经选择了具有main方法的类文件,但同样的问题仍然存在。如果我尝试用Eclipse Oxygen在Java1.8中做同样的事情,它输出很好,但有一些警告,但这是可以的。在Java1.8中,它导出。但是在Java1.

  • 我正在尝试将我的项目更新到Java 11-openjdk_11.0.2(目前在Java 8上)。我将与Jetty版本9.4.8.v20171121一起使用。 我可以在Java 8上毫无问题地运行该项目,但是如果我切换到Java 11,我会得到以下错误消息:

  • java.io.ioException:无法运行程序“/root/android/sdk/build-tools/23.0.1/aapt”:错误=2,没有这样的文件或目录

  • 编辑:我刚刚意识到,即使是一个带有应用程序条的简单屏幕,也会发生这种情况 错误:任务“:app:checkdebugaarmadata”的执行失败 无法解析配置“:app:debugRuntimeClasspath”的所有文件。无法解析com。谷歌。firebase:firebase firestore:22.1.2。所需人员:项目:应用程序 无法解析com。谷歌。firebase:firebas