[maven] Maven Shade Plugin ๋ก fat jar ๋ง๋ค๋ rewrite, transformers, filters ์์ ์ ์ํํ๋ค
Maven Shade Plugin์ ์ฌ๋ฌ JAR๋ฅผ ํฉ์ณ ํ๋์ ์คํ ๊ฐ๋ฅํ Fat JAR๋ก ๋ง๋๋ ๊ฒ์ด๋ค
๋น๋ ๊ฒฐ๊ณผ๋ฌผ(target/classes) + ์์กด์ฑ JAR๋ค ์์ ํด๋์ค/๋ฆฌ์์ค ํ์ผ์ ๋ชจ๋ ํ๋์ JAR์ ๋ณต์ฌํ๋ค
๋์ผํ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง ํ์ผ์ด ์ฌ๋ฌ JAR์ ์์๋ฉด ์ค๋ณต ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํค๊ณ ์ค๋ณตํด๊ฒฐ์ ์ํด rewrite(๋ง์ง๋ง ํ์ผ๋ง ํฌํจํ๋๋ก ๋ฎ์ด์ฐ๊ธฐ), transformers(ํฉ์น๊ธฐ), filters(์ ์ธํ๊ธฐ) ์์ ์ ์ํํ๋ค
์ฆ, ์ง์ ์ด๋ค ํ์ผ์ ํฉ์น ์ง ๋ฒ๋ฆด์ง ์ ํด์ผ ์์ ํ๊ฒ fat jar๊ฐ ์์ฑ๋๋ค
(1) META-INF/services/*
๋ํ์ ์ผ๋ก Spring Boot์์ META-INF/spring.handlers, META-INF/spring.schemas ํฉ์น ๋ ์ฌ์ฉํ๋ค.
(2) LICENSE, NOTICE, DEPENDENCIES
๋ผ์ด์ ์ค(LICENSE)์ด๋ ์ ์๊ถ ํ๊ธฐ(NOTICE)์ ๋ฒ์ ์ฉ๋๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฌด์์ ์ง์ฐ๋ ๊ฒ์ ๊ณ ๋ ค๋์ง ์๋๋ค.
๋ฐ๋ผ์, LICENSE ๋ NOTICE๋ transformer ํตํด์ ํ๋์ ํ์ผ๋ก ํฉ์น๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค. (OSS ๋ฐฐํฌ์ ํ์์ ๊ณต ํ์)
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/DEPENDENCIES</resource>
</transformer>
(3) META-INF/MANIFEST.MF : Jar ๋ฉํ๋ฐ์ดํฐ
<!-- ์คํ ํด๋์ค ์ง์ -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.eundms.RunCheckstyle</mainClass>
</transformer>
META-INF/*.SF, *.DSA, *.RSA : JAR ๋์งํธ ์๋ช ์ ๋ณด
์๋ ๊ฐ๊ฐ์ JAR๋ ์๋ช ๋ ์ํ๋ก ๋ฐฐํฌ๋๋๋ฐ Fat JAR๋ก ํฉ์น ๋ ์๋ช ์ ๋ณด๋ ๊ฐ์ด ๋ณต์ฌ๋๋ฉด
JVM์ด ์๋ช ์ ๊ฒ์ฆํ๋ค๊ฐ ์คํจํ๊ฑฐ๋ ์๋ฏธ ์๋ ์๋ช ์ผ๋ก ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํจ๋ค
๋ฐ๋ผ์, ์ ์ธํ๋ค.
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
์ฒ์์ META-INF/** ํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ฐ๋์ ํฌํจ๋์ด์ผ ํ๋ META-INF/services/*๊ฐ ์์ ์๋ ์๊ณ ,
java9 ๋ชจ๋ ์์คํ ๋์ ์์ ์๊ธด ํ์ผ๋ก ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชจ๋ ์์กด์ฑ/exports ๋ฅผ ์ ์ธํ๋ ๋ฉํ๋ฐ์ดํฐ์ด๋ค
fat jar์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ module-info.class๊ฐ ์ค๋ณต๋์ด jvm ์ ์ฅ์์๋ ๊ฐํ ์บก์ํ ์ ๋ณด๊ฐ ์ถฉ๋ ๋๋ ๊ฒ์ผ๋ก ์ธ์ํ๋ค.
๋ฐ๋ผ์, shade ๊ณผ์ ์์ ํ๋๋ง ๋จ๊ธฐ๊ฑฐ๋ ๋ฌด์ํ๊ฒ ๋๋๋ฐ ์ด๊ฒ ๊ฒฝ๊ณ ๋ ๋ฐํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์์ธ์ด ๋๋ค.
๋ฐ๋ผ์, ์ ์ธํ๋ค.
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>module-info.class</exclude>
</excludes>
</filter>
</filters>
3. ํน์ ๋ถํ์ํ ๋ฆฌ์์ค
mozilla/public-suffix-list.txt
>> ๊ณ์ ํ์ธํจ
mvn clean package
java -jar target/๋ผ์ด๋ธ๋ฌ๋ฆฌ-1.0.0.jar