私は、Grizzly サーバーを Java スタンドアロン アプリ内に埋め込んでいます。私はジャージーを使用して、REST 呼び出しを使用していくつかのリソースを提供しています。これは、Eclipse で実行/デバッグしているときに完全に機能しますが、[エクスポート] -> [実行可能な JAR] を使用して JAR を作成しようとすると、常に次のエラーが発生します。
SEVERE: ResourceConfig インスタンスにルート リソース クラスが含まれていません。
Grizzly Server を起動するクラスは次のとおりです。
/**
* 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ファイルをパックする方法にもっと関連しているように見えます...私はここで提案されたことを試しまし た:うまくいかないようです...
更新:クリーン、ビルド、ジャーなどの典型的なタスクで手作りのANTファイルを作成することで、これを修正することができました.ANTの特定のポイントがこの問題を修正しているとは言えません.. ここからダウンロードして、プロジェクトに合わせて変更すれば、同じ問題が発生した場合に再利用できます。