2014-01-27 56 views
2

我嘗試創建一個Grizzly Web服務引擎,但缺少一些元素。使用Grizzly作爲Web服務引擎

這裏是我想要做什麼:

  • 創建灰熊服務器作爲一個可執行的JAR(這是確定)

  • 此服務器將必須能夠尋找到一個用於Web服務歸檔的文件夾(包含在jar或戰爭或其他文件中)

  • 服務器應該公開此Web服務。

我已經知道:

  • Web服務可以建成爲servlet的(似乎灰熊能夠運行的servlet,但我沒有找到有關如何加載外部什麼serlvet包含在一個「.war」或其他)

  • 我試着用ClassLoader加載一個JAX-RS2 web服務導出在「.jar」但@path綁定不起作用(我可能錯過了一些東西)

我想知道:

  • 我應該使用哪種類型的檔案爲Web服務檔案?

  • Web服務應該成爲servlet嗎?在這種情況下,如何動態加載一個使用Grizzly的servlet?

  • 我會走錯方向嗎?

下面是我用的類加載器

File file = new File("c:\\Users\\User\\Desktop\\myresource.jar"); 
URL url = file.toURI().toURL(); 
URL[] urls = new URL[]{url}; 
ClassLoader cl = new URLClassLoader(urls); 

URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader()); 

Class<?> classToLoad = Class.forName ("Test.ExternalWS.MyResource", true, child); 
Method method = classToLoad.getDeclaredMethod ("getIt"); 
Object instance = classToLoad.newInstance(); 
Object result = method.invoke (instance); 
this.WSInstance = classToLoad.newInstance(); 
  • 這裏做的是web服務

    @Path( 「myresource」) 公共類MyResource {

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getIt() { 
        return "Got it!"; 
    } 
    

    }當我嘗試到本地主機達到

什麼也沒有發生:8080 /....../ myresource。

我試過所有可能的網址,並放置一個斷點...永遠不會到達。

回答

1

不確定您正在使用哪種澤西版本。 在澤西2我做了它的工作是這樣的:

File file = new File("/path/resource1.jar"); 
    URL url = file.toURI().toURL(); 
    URL[] urls = new URL[]{url}; 
    ClassLoader cl = new URLClassLoader(urls, Main.class.getClassLoader()); 

    ResourceConfig rc = new ResourceConfig() 
      .setClassLoader(cl) 
      .files("/path/resource1.jar"); 
    HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(
      BASE_URI, rc); 

可能有更優雅的方式......

+0

謝謝阿列克謝。 我不知道resourceConfig的setClassLoader()和files()方法。 我看了一下Jersey文檔,並沒有指定使用文件()需要classloader。 我試圖只使用文件(),我得到這些錯誤: 類名com.MyWS.MyResource的類文件被標識,但無法找到類。 有趣。 –

+0

我將深入討論這個files()方法。 找到一些文檔並不是很容易。 即使澤西島的文件不是很豐富。 以後我會再發帖子的時候,我會知道更多。 –

+0

順便說一句,是的,我正在使用澤西島的最後一個版本:2.5 –

0

您使用的灰熊的1.x或2.x的分支?

我在Grizzly 1.x中開發Grizzly Deployer。你應該檢查源代碼,如果它做你需要的東西