java 板


LINE

※ 引述《Neisseria (Neisseria)》之銘言: : 小弟用 gradle 想包一些 groovy 命令稿和靜態檔案 : build.gradle 如網址:https://pastebin.com/EUGbHCmg : 目前可以順利產生 JAR,該 JAR 也可以順利執行 : 不過 靜態檔案會跑到其他的資料夾 : 結構大致如下: : ├── classes : │ └── main : │ └── SomeClass.class : ├── libs : │ └── SomeClass-1.0.jar : ├── resources : │ └── main : │ └── static-file : └── tmp : ├── compileGroovy : │ └── groovy-java-stubs : └── uberjar : └── MANIFEST.MF : 我覺得我可能是誤會了 : static-file 不會跑進 JAR 裡 : 不過我不確定 所以 po 上來請各位大大解惑 : 感恩 我建了一些 sample class 與靜態檔: qty:t qrtt1$ tree . ├── build │ ├── classes │ │ └── main │ │ └── Hello.class │ ├── libs │ │ └── t-1.0.jar │ ├── resources │ │ └── main │ │ └── foo.txt │ └── tmp │ ├── compileGroovy │ │ └── groovy-java-stubs │ ├── jar │ │ └── MANIFEST.MF │ └── uberjar │ └── MANIFEST.MF ├── build.gradle └── src ├── groovy │ └── Hello.groovy └── resources └── foo.txt 14 directories, 8 files 摘錄會用到的部分如下: sourceSets { main { groovy { srcDir 'src/groovy' } resources { srcDir 'src/resources' } } } task uberjar(type: Jar, dependsOn:[':compileJava', ':compileGroovy', ':processResources']) { from files(sourceSets.main.output.classesDir) from configurations.runtime.asFileTree.files.collect { zipTree(it) } manifest { attributes 'Main-Class': 'SomeClass' } } 若是懷疑檔案沒進去,那就檢查一下源頭吧! 很明顯地黃字部分是源頭,綠字部分是其它 library 檔 那麼就來研究黃子部分的 code 吧。 沒頭緒!沒關係!gradle script 就是 groovy script 把它的類別印出來研究一下,在 build.gradle 最後面加上: println sourceSets.main.output.class println sourceSets.main.output.classesDir.class 執行一下: # gradle -q class org.gradle.api.internal.tasks.DefaultSourceSetOutput_Decorated class java.io.File classesDir 是個 File 物件,依它的命名猜是個錄目 DefaultSourceSetOutput 就是某個 gradle 的物件,先不知道它做什用的。 先不理它,來研究一下 classesDir 目錄內有什麼: 再加印一下它的內容: println "files in classesDir" sourceSets.main.output.classesDir.eachFile { println it } /Users/qrtt1/t/build/classes/main/Hello.class 你發會現它沒有 靜態檔 只有 .class。 看來得換一條路來查了,如果在 sourceSets.main.output.classesDir 沒有我們期待的檔,那在它的上一層會不會有呢? 不確定要怎麼查但它是個 groovy object 先用 each 看看運氣: sourceSets.main.output.each { println it } /Users/qrtt1/t/build/classes/main /Users/qrtt1/t/build/resources/main 你會發現它印出了二個目錄,依剛剛變數的名字來看 sourceSets.main.output.classesDir 就會是 /Users/qrtt1/t/build/classes/main 那麼代表目錄 /Users/qrtt1/t/build/resources/main 的變數叫什麼? 沒頭緒沒關係,找一下 property 有 Dir 的看看。 加 build.gradle 印一下: println sourceSets.main.output.properties.grep { it.key.contains("Dir") } 只要沒有被 MOP 動手腳,groovy object 都有 properties 只要是 groovy object 就有基 grep 能用囉 qty:t qrtt1$ gradle [classesDir=/Users/qrtt1/t/build/classes/main, resourcesDir=/Users/qrtt1/t/build/resources/main] ======================================================== 以上是簡單的野外求生過程, 不過先前其實有查到是哪個類別了,直接看 source code 比較快 https://github.com/gradle/gradle/blob/master/subprojects/ plugins/src/main/groovy/ org/gradle/api/internal/tasks/DefaultSourceSetOutput.java 縮:http://bit.ly/1SPm1Ke 所以,由上述的歷程可以知道你根本缺少了 resources 檔的位置。 依直覺可以這麼寫: task uberjar(type: Jar, dependsOn:[':compileJava', ':compileGroovy', ':processResources']) { from files(sourceSets.main.output.classesDir) from files(sourceSets.main.output.resourcesDir) from configurations.runtime.asFileTree.files.collect { zipTree(it) } manifest { attributes 'Main-Class': 'SomeClass' } } 你就得到了有 resources file 的 uberjar qty:t qrtt1$ unzip -l build/libs/t-1.0.jar |grep foo 0 04-15-16 18:01 foo.txt 不過依手冊與 source code 的明示、暗示, 它是一個 Composite Pattern public class DefaultSourceSetOutput extends CompositeFileCollection implements SourceSetOutput { } 通俗一點的叫『樹』,簡單地說應該要有獲得 parent 就得到它包含物的效果 你可以改寫成: from files(sourceSets.main.output) 再加上 CopySpec 手冊說明 http://bit.ly/1VtZKbl , from (...) 它會自動呼叫 project.files,所以又能再簡化成: from sourceSets.main.output 於是開心地打完收工,謝謝收看。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.21.157.223
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1460717223.A.650.html
1F:推 Neisseria: 感謝大大回得那麼認真,我會再試試看 04/15 22:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP