2017-04-20 125 views
8

比方說,我必須通過mywebapp.war部署一個很普通的Web應用程序,通過Maven產生:如何將JAR文件部署到現有的webapp子目錄?

webapps 
    | 
    |--mywebapp.war 
    |--mywebapp 
     | 
     |--images 
     |--js 
     |--jsp 
     |--jardeploy 
     |--META-INF 
     |--styles 
     |--WEB-INF 

現在我想myjarfile1.jarmyjarfile2.jar(或更多)webapps/mywebapp/jardeploy部署。它們是另一個Maven項目的工件,而不是造成戰爭的那個。它們也不是mywebapp使用的罐子,它將在WEB-INF/lib之下,而是可單獨構建的可下載罐子,而不是mywebapp源代碼的一部分。

有沒有辦法打包存檔捆綁在Maven中的兩個或多個罐子其中,在webapps跌落時會得到不默認webapps/jardeploywebapps/mywebapp/jardeploy部署?這與我拿着罐子並將它們複製到該目錄中的方式是一樣的,但我希望遵循標準的應用服務器部署協議,方法是將生成的工件放在webapps中,而不是以前的方式。我實際上想要一個正式的工件(就像戰爭),而不是一個後期部署插件。有沒有辦法告訴(可能在清單中)如果該目錄存在,它需要解壓縮jar並將其放入該目錄中?

容器不應該的問題,但它是Tomcat的7

+0

爲什麼你需要打包它們,如果他們不會被你的'mywebapp'使用?如果你在'mywebapp'中使用它們,那麼爲什麼你需要將它們部署到不同的目錄? – ayip

+0

它們確實用作從mywebapp啓動的webstart。但是它們的構建過程與包含的Web應用程序完全不同。這是一款應用內的應用。 – amphibient

+0

它與您的網站上的永久下載鏈接類似,但由於版本控制,它們需要經常重建(而不是項目結構中的靜態文件)。所以,你建立你的網絡應用程序,然後構建可下載的工件(這是什麼webstart本質上是+可運行的) – amphibient

回答

5

這看起來像一個標準的用例爲Maven的戰爭插件和額外的資源,除非我失去了一些東西。 例如here(請參閱配置網絡資源部分)告訴您可以在戰爭版本中包含額外資源(這是您的兩個罐子對我來說是:額外的資源)

如果這不適用於您那麼maven-assembly-plugin允許你指定一個更靈活的格式。

+0

我在考慮WAR,但是當我嘗試它時,它需要一個包含web.xml的特定目錄結構,沒有。 – amphibient

+0

如果你沒有web.xml,那麼你已經超出了「標準」。因此,我認爲程序集插件可以讓你在這裏獲得最大的靈活性。 – Andrei

+0

你不能在那裏放一個虛擬的web.xml嗎?只是爲了滿足戰爭插件?我認爲你可以從打包中排除web.xml文件本身。 – Andrei

1

您可以使用WebListener創建一個webapps,將jar文件複製到mywebapp/jardeploy目錄中。所以當這個應用程序被部署在你的容器中時,它將把罐子複製到你想要的地方。

我測試過,它的工作原理!假設你已經創造了這個新的Web應用程序,並把罐子在的src/main/webapps /下罐目錄,WebListener看喜歡這樣的:

@WebListener 
public class Deployer implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent sce) { 
     String realPath = sce.getServletContext().getRealPath("/jars"); 
     try { 
      Files.copy(new File(realPath + "/myjarfile1.jar").toPath(), 
       new File(System.getProperty("catalina.base")+"/webapps/mywebapp/jardeploy/myjarfile1.jar").toPath()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     System.out.println("On shutdown web app"); 
    } 
} 

此代碼只是一個概念驗證,可以增強,但它服務於其目的。它只複製一個jar(myjarfile1.jar)到/webapps/mywebapp/jardeploy。 PS:我使用maven原型創建了這個新的webapp。