Jersey在使用maven assembly插件创建uber jar时失败

Jersey在使用maven assembly插件创建uber jar时失败,maven,jersey,jersey-2.0,embedded-jetty,jar-with-dependencies,Maven,Jersey,Jersey 2.0,Embedded Jetty,Jar With Dependencies,我已经创建了一个maven jersey starter Web应用程序。我还使用jetty插件在我的应用程序中嵌入了jetty服务器 当我使用mvnjetty:run命令运行我的项目时,我的项目运行良好 但是,当我使用mvncleanpackage命令打包我的项目并运行名为jar且具有依赖项的jar文件时,项目会在从jersey资源返回json响应时抛出此异常 严重:找不到媒体类型=应用程序/json、类型=class com.nitish.freecharge.model.Count、gen

我已经创建了一个maven jersey starter Web应用程序。我还使用jetty插件在我的应用程序中嵌入了jetty服务器

当我使用mvnjetty:run命令运行我的项目时,我的项目运行良好

但是,当我使用mvncleanpackage命令打包我的项目并运行名为jar且具有依赖项的jar文件时,项目会在从jersey资源返回json响应时抛出此异常

严重:找不到媒体类型=应用程序/json、类型=class com.nitish.freecharge.model.Count、genericType=class com.nitish.freecharge.model.Count的MessageBodyWriter。

这是我的pom.xml文件

http://maven.apache.org/maven-v4_0_0.xsd“>

以下是启动服务器后访问项目url时执行的唯一jersey资源类:

package com.nitish.freecharge.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import com.nitish.freecharge.dao.FileDAO;
import com.nitish.freecharge.model.Count;

/**
 * Root resource (exposed at "count" path) which handles HTTP GET method and returns the count value;
 */
@Path("/count")
public class CountResource {

    private FileDAO fileDAO=new FileDAO();

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "application/json" media type.
     *
     * @return String that will be returned as a application/json response.
     */
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @QueryParam("query")
    public Response getWordCount(@QueryParam("query")String query) {
        Error error=null;
        Count count=null;
        try{   
            if(query!=null){
                query=query.trim();
                if(query.length()>0 && query.matches("^[A-Za-z]+$")){
                    long c=fileDAO.getCount(query.toLowerCase());
                    count=new Count(c);
                }else{
                    error=new Error("Some Error Occured.Please Try Again With a new word!");
                }
            }else{
                error=new Error("Some Error Occured.Please Try Again!");
            }
        }catch(Exception e){
            error=new Error(e.getMessage());
            return Response.status(Status.INTERNAL_SERVER_ERROR).entity(error).build();
        }
        if(count!=null){
            return Response.status(Status.OK).entity(count).build();
        }else{
            return Response.status(Status.BAD_REQUEST).entity(error).build();
        }
    }
}
打包后,使用命令运行完整的嵌入式项目 java-jar awesomeProject.jar

我在服务器提示符上得到这个输出


我已经尝试了很多,但无法将我的嵌入式webapp打包以解决此问题。我是maven和打包新手。请帮助我犯错误的地方。

如果您查看MOXy jar内部,您将看到一个文件夹
META-INF/services
。在该文件夹中,您将看到一个名为
org.glassfish.jersey.int的文件ernal.spi.AutoDiscoverable
。该文件的内容应为单行

org.glassfish.jersey.moxy.json.internal.MoxyJsonAutoDiscoverable
此文件的目的是允许Jersey发现为Jersey注册MOXy的
MoxyJsonAutoDiscoverable
。此服务加载程序模式允许Jersey发现并注册功能,而无需我们自己注册

在创建uber jar时,这会带来一个问题,即可能有多个jar使用同一个文件,因为不同的jar有不同的功能需要发现,但文件必须是准确的名称,因为服务加载程序模式就是这样工作的

所以你有一堆jar都有相同的文件,但是当你创建uber jar时,你不能有多个同名的文件。这是不可能的。所以只有一个文件被放入最终的jar中。哪一个..谁知道呢。但这意味着如果MOXy的文件不是那个文件,那么它的功能就不会被自动发现,而且我们也不知道这些类被打包在uber jar中,但是主要的功能组件没有注册。你可以自己注册

jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
                               "org.glassfish.jersey.moxy.json.MoxyJsonFeature");
但是,由于不包括自动发现文件而可能被忽略的所有其他功能又如何呢

因此,您应该使用,而不是汇编插件,它具有转换器,允许我们将服务文件的内容连接到一个文件中

配置看起来像

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.YourApp</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

org.apache.maven.plugins

.jersey.config.server.provider.classnames、“org.glassfish.jersey.moxy.json.MoxyJsonFeature”非常感谢;解决了这个问题。但是当使用maven shade插件时,最终输出是awesomeProject.war文件,但我需要一个jar文件。如何使用mave shade插件获取主类的可执行jar文件?请查看pom.xml文件中的
。它应该是
jar
而不是
war
。我知道您需要
war
来使用它
jetty maven插件
,但要获得jar,您需要记住将其更改为jar。@user2327445您应该将此答案标记为正确…它也帮助了我,所以我不知道如何将答案标记为正确。您能帮我吗
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
                               "org.glassfish.jersey.moxy.json.MoxyJsonFeature");
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.YourApp</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>