Java 我的jar中缺少标准消息正文读取器提供程序

Java 我的jar中缺少标准消息正文读取器提供程序,java,jersey,client,Java,Jersey,Client,我必须错过一些东西两天了 我有一个简单的jar应用程序,它使用jersey客户端jar。 当我从Eclipse或mvn exec运行我的主类时,一切都很顺利 当我构建jar并使用java-jar运行它时,我得到: com.sun.jersey.api.client.clienthandler异常:未找到Java类Java.lang.String、Java类型类Java.lang.String和MIME媒体类型application/json的消息体读取器 i、 e.我客户的提供者列表中缺少所有标

我必须错过一些东西两天了

我有一个简单的jar应用程序,它使用jersey客户端jar。 当我从Eclipse或mvn exec运行我的主类时,一切都很顺利

当我构建jar并使用java-jar运行它时,我得到:

com.sun.jersey.api.client.clienthandler异常:未找到Java类Java.lang.String、Java类型类Java.lang.String和MIME媒体类型application/json的消息体读取器

i、 e.我客户的提供者列表中缺少所有标准Java类型的正文阅读器提供者

我在客户端的pom.xml依赖项中声明:

  • 泽西岛客户
  • 球衣核心
  • 泽西json
  • 泽西服务器
  • 杰克逊地图绘制者
  • jackson core asl
  • 泽西多部分
让我的应用程序工作的唯一方法是在客户端的配置中声明StringProvider类

config.getClasses().add(StringProvider.class);

但是这个提供程序取消限制必须只对自定义bean是必需的?默认情况下是否可以访问标准bean提供程序?不是吗?

您是否将所有类捆绑在一个jar中(包括来自jersey模块的类)?如果是这样的话,那么这看起来像是您丢失了一些META-INF文件,或者您将其合并到一个模块中,一个同名的文件从另一个模块中重写了一个同名的文件。

我在发布后差不多一年才发现这一点,但事实证明,我的问题是使用shade将所有内容合并到一个jar中。再加上几个变压器似乎已经解决了问题。我的shade插件conf现在看起来是这样的:

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.sandwormz.jettycore.NotezWebsocketMain</mainClass>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/services/javax.ws.rs.ext.MessageBodyReader</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/services/javax.ws.rs.ext.MessageBodyWriter</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.sandwormz.jettycore.NotezWebsocketMain</mainClass>
                            </transformer>
                        </transformers>
                        <filters>
                            <filter>
                                This is required if we want anything build on top of this
                                to
                                compile without security errors.
                                <artifact>*</artifact>
                                <excludes>
                                    <exclude>**/*.MF</exclude>
                                    <exclude>**/*.SF</exclude>
                                    <exclude>**/*.DSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>

org.apache.maven.plugins
maven阴影插件
2
假的
包裹
阴凉处
com.sandwormz.jettycore.NotezWebsocketMain
META-INF/spring.handlers
META-INF/spring.schemas
META-INF/services/javax.ws.rs.ext.MessageBodyReader
META-INF/services/javax.ws.rs.ext.MessageBodyWriter
com.sandwormz.jettycore.NotezWebsocketMain
如果我们想在此基础上构建任何东西,这是必需的
到
编译时没有安全错误。
*
**/*.MF
**/*.SF
**/*.DSA

希望这对某人有所帮助。

谢谢你的回复,马丁。我首先将我的客户机和所有jersey deps打包在client.jar中。我已经使用maven shade来确保正确构建META-INF。然后,我将最后一个应用程序打包为对客户端jar的依赖。无论如何,我将检查我的所有META-INF文件StringProvider是否在META-INF/services/javax.ws.rs.ext.MessageBodyReader的jersey核心模块中注册。看看它是否存在于client.jar文件中。。。事实上,当我构建这个jar时,client.jar的META-INF代表是空的,“没有依赖项”,就像一个库。但是在使用客户端的my app.jar中,META-INF包含所有提供者类(来自jersey json和jersey core)。你认为问题在于提供者没有在client.jar本身中注册吗!!我浪费了整整一天才看到这个。你是救世主!!谢谢