์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[maven] Maven Shade Plugin ๋กœ fat jar ๋งŒ๋“ค๋•Œ rewrite, transformers, filters ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

๋ณธ๋ฌธ

Maven Shade Plugin ์ค‘๋ณต ๋ฆฌ์†Œ์Šค ์ฒ˜๋ฆฌ ์›๋ฆฌ

Maven Shade Plugin์€ ์—ฌ๋Ÿฌ JAR๋ฅผ ํ•ฉ์ณ ํ•˜๋‚˜์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Fat JAR๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค 

๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(target/classes) + ์˜์กด์„ฑ JAR๋“ค ์•ˆ์˜ ํด๋ž˜์Šค/๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๋ชจ๋‘ ํ•˜๋‚˜์˜ JAR์— ๋ณต์‚ฌํ•œ๋‹ค 

๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ JAR์— ์žˆ์‘๋ฉด ์ค‘๋ณต ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์ค‘๋ณตํ•ด๊ฒฐ์„ ์œ„ํ•ด rewrite(๋งˆ์ง€๋ง‰ ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜๋„๋ก ๋ฎ์–ด์“ฐ๊ธฐ), transformers(ํ•ฉ์น˜๊ธฐ), filters(์ œ์™ธํ•˜๊ธฐ) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

์ฆ‰, ์ง์ ‘ ์–ด๋–ค ํŒŒ์ผ์„ ํ•ฉ์น ์ง€ ๋ฒ„๋ฆด์ง€ ์ •ํ•ด์•ผ ์•ˆ์ „ํ•˜๊ฒŒ fat jar๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค 

 

์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์‹

transformers

(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>

filters

1. META-INF/** ๋‚ด ์„œ๋ช… ํŒŒ์ผ ์ œ์™ธ 

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/*๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , 

 

 

 

2. module-info.class ์ œ์™ธ

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

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ