pom.xml에서 pluginManagement 안에 있는 plugin이 적용 안 될 경우

김효민·2020년 12월 28일
0

TIL

목록 보기
3/3

발단

필자는 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이 적용됐다.

Reference

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

profile
귀찮음에 민감한 개발자

0개의 댓글