2013-06-05 3 views
1

Я внедряю сервер Grizzly в автономное приложение Java. Я использую Джерси, чтобы обслуживать некоторые ресурсы, используя вызовы REST. Хотя это работает отлично, когда я запускаю/отлаживаю Eclipse при попытке создать JAR с помощью Export -> Runnable JAR, я получаю следующую ошибку:Джерси не может найти ресурсы при развертывании как JAR, но работает в Eclipse

SEVERE: экземпляр ResourceConfig не содержит никаких root классов ресурсов.

Вот мой класс, который запускает сервер Grizzly:

/** 
* Constructor 
*/ 
public RestServer(){ 
    //set up default initParams 
    initParams.put("com.sun.jersey.config.property.packages", packageName); 
    initParams.put("com.sun.jersey.api.json.POJOMappingFeature", Boolean.toString(jsonParsing)); 
} 

/** 
* Starts the Grizzly Server thread 
* @return TRUE if start was correct 
*/ 
public boolean startGrizzly(){ 
    if (grizzlyRunning){ 
     Logger.error(DEBUG_TAG, "Grizzly Server is already running"); 
     return false; 
    } 
    else{ 
     String hostString = host; 
     String portString = Integer.toString(port); 
     String server = "http://" + hostString + ":" + portString + "/"; 
     try { 
      selector = GrizzlyWebContainerFactory.create(server, initParams); 
      selector.setKeepAliveTimeoutInSeconds(-1); 
      grizzlyRunning = true; 
      return true; 
     } 
     catch (IllegalArgumentException | IOException e) { 
      Logger.error(DEBUG_TAG, "There was an error trying to start the Grizzly Server. Reason is " + e.getMessage()); 
      grizzlyRunning = false; 
      return false; 
     } 
    } 

} 

/** 
* Stops the Grizzly Server thread 
* @return TRUE if stop was correct 
*/ 
public boolean stopGrizzly(){ 
    if (grizzlyRunning){ 
     selector.stopEndpoint(); 
     grizzlyRunning = false; 
     return true; 
    } 
    else{ 
     Logger.error(DEBUG_TAG, "Grizzly is not running. Cannot stop it"); 
     return false; 
    } 
} 

Имя пакета содержит путь к моему другому классу, который имеет REST ресурсы, в данном случае «com.mareculum.model». Тем не менее, это класс, который служит:

package com.mareculum.model; 

@Path("/json") 
public class RestResources { 

    /** 
    * Debugging tag 
    */ 
    private static final String DEBUG_TAG = "RestResources"; 


    /** 
    * Gets the JSON collection of data from itsaseusbuoys 
    * @return The JSON array containing the data from itsaseus buoys 
    */ 
    @GET 
    @Path("/get/itsaseus_data_raw") 
    @Produces(MediaType.APPLICATION_JSON) 
    public ItsaseusDataEntity [] getItsaseusDataRaw() { 
     Vector<ItsaseusDataEntity> ret = getItsaseusBuoysData(); 
     if (ret != null){ 
      return (ItsaseusDataEntity[]) ret.toArray(); 
     } 
     else{ 
      return null; 
     } 
    } 


    /** 
    * Gets the JSON collection of data from itsaseusbuoys 
    * @return The JSON array containing the data from itsaseus buoys 
    */ 
    @GET 
    @Path("/get/itsaseus_fusion_table") 
    @Produces(MediaType.APPLICATION_JSON) 
    public ItsaseusFusionTableRow [] getItsaseusDataEntity() { 
     ArrayList<ItsaseusFusionTableRow> data = getDataFromItsaseusTable(); 
     ItsaseusFusionTableRow [] retArray = new ItsaseusFusionTableRow[]{}; 
     if (data != null){ 
      retArray = data.toArray(new ItsaseusFusionTableRow[data.size()]); 
      return retArray; 
     } 
     else{ 
      return null; 
     } 
    } 

    /** 
    * Gets the JSON data from NOAA 
    * @return The JSON object containing data from NOAA buoy 
    */ 
    @GET 
    @Path("/get/noaa_fusion_table") 
    @Produces(MediaType.APPLICATION_JSON) 
    public BuoyRSSData [] getNoaaDataEntity() { 
     ArrayList<BuoyRSSData> data = getDataFromNoaaTable(); 
     BuoyRSSData [] retArray = new BuoyRSSData[]{}; 
     if (data != null){ 
       retArray = data.toArray(new BuoyRSSData[data.size()]); 
       return retArray; 
     } 
     else{ 
      return null; 
     } 
    } 
} 

Как вы можете видеть, здесь нет ничего сложного. Она смотрит на меня что-то в большей степени связаны с тем, как упаковать файл JAR так Джерси знает, где искать ... Я попробовал то, что было предложено здесь: https://groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ Но это не похоже на работу ...

UPDATE: Мне удалось это исправить, создав файл ANT с ручной работой с типичными задачами: clean, build, jar и т. Д. Я не могу сказать, какая конкретная точка моего ANT исправляет эту проблему ... но это так. Вы можете загрузить его here и повторно использовать его, если у вас такая же проблема, если вы измените его в соответствии с вашим проектом.

ответ

0

трудно сказать без вашего web.xml, но проверьте следующее:

много причин, вызывающих это сообщение об ошибке «ResourceConfig». Мало решения, которые я знаю:

com.sun.jersey.config.property.packages doesn’t exist in your web.xml. 
com.sun.jersey.config.property.packages included a resource that doesn’t include any jersey services. 
+0

Привет, у меня нет файла web.xml, так как я встраивание гризли, не нужно. На самом деле, это идея встраивания сервера в автономное приложение Java, иначе я бы использовал Tomcat или подобное. Предлагаемые решения не работают, в основном потому, что они не будут работать в Eclipse, если там, где нет пакета с ресурсом вообще ... thx anyway – AlejandroVK

+0

Я не понимаю, что именно вы собираетесь делать, но вы можете захотеть прочитайте это: http://www.vogella.com/articles/REST/article.html#restjersey, прежде чем продолжить. – sschrass

+0

Привет, я уже прочитал этот учебник, который велик (как обычно, с Vogel), но я не хочу использовать Tomcat, Glassfish и т. Д. Специально, потому что я только обслуживаю несколько ресурсов. Таким образом, я интегрирую крошечный сервер REST с Grizzly, хотя Jetty также может быть использован для этого. Nevermind, мне удалось исправить это с помощью сделанного вручную ANT-файла (см. Обновленный вопрос) Спасибо за помощь в любом случае :) – AlejandroVK

Смежные вопросы