2014-12-18 102 views
0

我已經在爆炸戰爭文件中使用碼頭設置了gradle項目,並與watch插件一起使用。對於任何java依賴項,如果源被修改,手錶插件將啓動'jar'任務和一個複製任務,將生成的jar放入分解的war文件中。使用碼頭的自動重新加載,這個新的罐子被拿起。一切都很好。jettyRun爆炸戰爭在複製任務中寫入問題

我對包含javascript和css源文件的模塊有類似的看法。修改後,文件將被構建(使用gulp插件進行concat/minify)並執行復制任務以將它們複製到war文件中。但是,在試圖複製.js和.css文件時,由於jetty當前正在使用這些文件,因此我得到由只讀問題導致的異常。

無論如何要解決這個問題,而不必停止/啓動碼頭?以下是我的配置/任務的相關部分。

碼頭配置如下:

jettyRun { 
    httpPort = 8080 
    contextPath = project.name 
    scanIntervalSeconds = 1 
    reload = "automatic" 
    webAppSourceDirectory = file(EXPLODED_DIR) 
} 

手錶配置:

watch {   
    clientwatch { 
     files fileTree(CLIENT_SRC_DIR).include('**/*.js', '**/*.css') 
     tasks ':client_module:assemble', 'copyClientFiles' 
    } 
} 

副本任務:

task copyClientFiles(type: Copy) { 
    from fileTree(CLIENT_BUILD_DIR).include("*.min.js", "*.min.css") 
    into EXPLODED_DIR 
} 
copyClientFiles.inputs.dir CLIENT_BUILD_DIR 
copyClientFiles.outputs.dir EXPLODED_DIR 

回答

0

我居然找到了解決我的問題就在這裏:

http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows 

其中規定:

碼頭緩衝區進行的webapps如HTML文件,CSS文件,圖片等靜態內容和使用內存映射文件如果正在使用的NIO連接器做到這一點。問題是,在Windows上,內存映射文件會導致文件被鎖定......

爲了解決這個問題,我只是添加在web.xml中<web-app>節點下的以下內容:

<servlet> 
    <servlet-name>default</servlet-name> 
    <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class> 
    <init-param> 
     <param-name>useFileMappedBuffer</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet>