6

मैंने एक मेवेन जर्सी स्टार्टर वेबपैप बनाया है। इसके अलावा मैंने जेट्टी प्लगइन का उपयोग करके अपने ऐप में जेट्टी सर्वर एम्बेड किया है।जर्सी-असेंबली-प्लगइन के साथ uber जार बनाने के दौरान जर्सी विफल रहता है

मेरी परियोजना ठीक काम कर रही है जब मैं एमवीएन जेट्टी: रन कमांड का उपयोग करके अपना प्रोजेक्ट चलाता हूं।

लेकिन जब मैं एमवीएन क्लीन पैकेज कमांड का उपयोग करके अपनी परियोजना को पैकेज करता हूं और जार फ़ाइल चलाता हूं जिसमें नाम जार-निर्भरता है, तो परियोजना जर्सी संसाधन से जेसन प्रतिक्रिया लौटते समय इस अपवाद को फेंकता है।

गंभीर: मीडिया प्रकार = आवेदन/json, type = वर्ग com.nitish.freecharge.model.Count, genericType = वर्ग com.nitish.freecharge.model.Count के लिए नहीं मिला MessageBodyWriter।

यहाँ मेरी pom.xml फ़ाइल

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

<modelVersion>4.0.0</modelVersion> 

<groupId>com.nitish.freecharge</groupId> 
<artifactId>wordcount</artifactId> 
<packaging>war</packaging> 
<version>2.0</version> 
<name>wordcount</name> 

<build> 
    <finalName>wordcount</finalName> 
    <resources> 
     <resource> 
      <directory>src/main/java</directory> 
     </resource> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
     <resource> 
      <directory>src/main/webapp</directory> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <inherited>true</inherited> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.3.0.v20150612</version> 
      <configuration> 
       <scanIntervalSeconds>5</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/wordcount</contextPath> 
       </webApp> 
       <httpConnector> 
        <!--host>localhost</host --> 
        <port>9999</port> 
       </httpConnector> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <executions> 
       <execution> 
        <id>package-jar</id> 
        <phase>package</phase> 
        <goals> 
         <goal>jar</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <finalName>awesomeProject</finalName> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey</groupId> 
      <artifactId>jersey-bom</artifactId> 
      <version>${jersey.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-server</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-server</artifactId> 
     <version>9.3.8.v20160314</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlet</artifactId> 
     <version>9.3.8.v20160314</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.4</version> 
    </dependency> 
</dependencies> 
<properties> 
    <jersey.version>2.22.2</jersey.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

मैं अपने मुख्य चालक बनाया है है डिफ़ॉल्ट पैकेज में App.java के रूप में कक्षा। यहां मेरी ऐप.जावा सामग्री

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class App { 
    public static void main(String []gg){ 

     Server server = new Server(9999); 

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/wordcount/*"); 
     jerseyServlet.setInitOrder(1); 
     jerseyServlet.setInitParameter("jersey.config.server.provider.packages","com.nitish.freecharge.resources"); 
     try { 
      System.out.println("Starting the server.."); 
      server.start(); 
      System.out.println("Server started"); 
      server.join(); 
     } catch(Exception e) { 
      System.out.println("Exception in starting the server "); 
      e.printStackTrace(); 
     } 
    } 
} 

यहां मेरा ऑनल है y जर्सी संसाधन वर्ग जो निष्पादित हो जाता है जब मैं सर्वर शुरू करने के बाद अपने प्रोजेक्ट यूआरएल का उपयोग:

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(); 
     } 
    } 
} 

पैकेजिंग के बाद और कमांड जावा का उपयोग कर पूरा एम्बेडेड प्रोजेक्ट को चलाने जार awesomeProject.jar

मैं इस आउटपुट प्राप्त सर्वर शीघ्र

enter image description here

पर मैं बहुत कोशिश की और इस तरह से कि इस समस्या का समाधान हो जाता है में अपने एम्बेडेड webapp पैकेज करने में असमर्थ है। मैं मैवेन और पैकेजिंग के लिए नया हूँ। कृपया मदद करें जहां मैं गलती कर रहा हूं।

उत्तर

15

यदि आप मोक्सी जार के अंदर देखते हैं, तो आपको एक फ़ोल्डर META-INF/services दिखाई देगा। उस फ़ोल्डर में, आपको org.glassfish.jersey.internal.spi.AutoDiscoverable नाम की एक फ़ाइल दिखाई देगी। उस फ़ाइल की सामग्री एक ही पंक्ति

org.glassfish.jersey.moxy.json.internal.MoxyJsonAutoDiscoverable 

क्या इस फाइल जर्सी MoxyJsonAutoDiscoverable, जो जर्सी के लिए MOXY पंजीकृत करता है खोजने के लिए अनुमति देने के लिए है के लिए है होना चाहिए। यह सेवा लोडर पैटर्न जर्सी को सुविधाओं को खोजने और उन्हें पंजीकृत करने की अनुमति देता है, बिना उन्हें स्वयं पंजीकृत करना।

उबेर जार बनाने के दौरान यह समस्या उत्पन्न होती है कि एक ही फ़ाइल के साथ कई जार हो सकते हैं, क्योंकि अलग-अलग जारों की खोज करने के लिए अलग-अलग विशेषताएं होती हैं, लेकिन फ़ाइल को उस सटीक नाम की आवश्यकता होती है जैसे सेवा लोडर पैटर्न काम करता है।

तो आपके पास एक ही फ़ाइल के साथ जार का एक समूह है, लेकिन जब आप उबेर जार बनाते हैं, तो आपके पास एक ही नाम के साथ कई फाइलें नहीं हो सकती हैं। यह सिर्फ संभव नहीं है। तो फाइलों में से केवल एक को अंतिम जार में डाल दिया जाता है। कौन सा .. कौन जानता है। लेकिन इसका मतलब है कि यदि MOXy की फ़ाइलें एक फ़ाइल नहीं है तो इसकी सुविधा स्वतः खोज नहीं की जाएगी, और हमें इसे स्वयं पंजीकृत करने की आवश्यकता है। इसलिए कक्षाएं उबेर जार में पैक की जाती हैं, लेकिन मुख्य सुविधा घटक अभी पंजीकृत नहीं है।तुम सिर्फ यह अपने आप

jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", 
           "org.glassfish.jersey.moxy.json.MoxyJsonFeature"); 

लेकिन क्या अन्य सभी संभव सुविधाओं है कि संभवतः बाहर छोड़ दिया जाता है क्योंकि उनके ऑटो को खोजने योग्य फ़ाइल शामिल नहीं है के बारे में रजिस्टर कर सकते हैं?

इस कारण से, असेंबली प्लगइन के बजाय, आपको maven-shade-plugin का उपयोग करना चाहिए, जिसमें ट्रांसफॉर्मर हैं जो हमें फ़ाइल पर समान नाम फ़ाइलों की सामग्री को संयोजित करने की अनुमति देते हैं।

विन्यास की तरह

<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> 

कुछ ऐसा दिखाई देगा ServicesResorceTransformaer क्या फ़ाइलों संयोजित करता है। प्लगइन की यह विशेष विन्यास Dropwizard getting started से ले रही थी। आप आगे स्पष्टीकरण के लिए इसे देखना चाह सकते हैं।

+0

बहुत बहुत धन्यवाद। jerseyServlet.setInitParameter ("jersey.config.server.provider.classnames", "org.glassfish.jersey.moxy.json.MoxyJsonFeature"); इस मुद्दे को हल किया गया। लेकिन जब मैवेन-शेड-प्लगइन का उपयोग करते हैं तो अंतिम आउटपुट awesomeProject.war फ़ाइल है लेकिन मुझे इसके बजाय एक जार फ़ाइल चाहिए। mave-shade-plugin का उपयोग कर मुख्य वर्ग के साथ निष्पादन योग्य जार फ़ाइल कैसे प्राप्त करें? –

+0

अपनी pom.xml फ़ाइल में अपने '' को देखें। यह 'जार' नहीं होना चाहिए 'युद्ध'। मैं समझता हूं कि आपको 'जेटी-मेवेन-प्लगइन' का उपयोग करने के लिए 'युद्ध' की आवश्यकता है, लेकिन जार पाने के लिए, आपको इसे जार में बदलने की याद रखना होगा। –

+0

धन्यवाद peeskillet! यह पूरी तरह से ठीक काम किया। –

संबंधित मुद्दे