필자는 IDE로 VS Code를 사용한다. VS code의 Maven for Java plugin을 사용해서 maven project를 만들면 pom.xml에 이하와 같이 pluginManagement설정이 들어있다.
...
<build>
<finalName>reservation</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
...
그 동안 필자는 이 pluginManagement를 제대로 이해하지 않고 사용하다가 uberjar을 만드는 과정에서 시행착오를 겪고 알게 된 지식을 잊지 않기 위해 글로 남긴다.
uberjar을 생성하는 데에는 여러가지 방법이 있지만 필자가 사용한 방법은(위의 링크에 설명 돼있지만) Apache Maven Shade Plugin을 이용하는 방법이었다. 이 방법을 사용하려면 당연하게도 해당 프로젝트에 plugin을 추가해야 한다. 하지만 필자는 pluginManagement가 뭔지 모르고
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</pluginManagement>
이런 식으로 shade plugin을 설정했다.
하지만 이대로 실행을 하니 shade plugin은 작동하지 않았다.
Maven 홈페이지를 참조해보면 pluginManagement는 parent-pom에서 child-pom들과 plugin 설정을 공유할 때 사용한다. 이것만 보면 왜 안돼는 거지? 싶어서 StackOverflow에 검색했더니 비슷한 사례가 다행이도 있었다.
여기에 있는 답변을 인용하자면
But adding a plugin to pluginManagement section does not make your project invoke that plugin.
즉 pluginManagement에 들어있는 plugin은 해당 프로젝트에서 작동하지 않는다!
이 사실을 깨달은 나는 사용하지도 않는 pluginManagement를 지워버리고
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>me.hyoputer.SteamFollowedGameNewsLetter</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
이런 식으로 구성하였더니 그제야 shade plugin이 적용됐다.
shade plugin 기본 사용법 - http://asuraiv.blogspot.com/2016/01/maven-shade-plugin-1-resource.html
stackoverflow 사례 - https://stackoverflow.com/questions/53918867/pluginmanagement-interferes-with-shade-plugin