복붙노트

[SPRING] spring-boot : 패키징에 대한 종속성 제외

SPRING

spring-boot : 패키징에 대한 종속성 제외

저는 다른 프로젝트 (프로젝트 B, 프로젝트 C ...)에 포함될 스프링 부트 프로젝트 (프로젝트 A)를 작업 중입니다. 프로젝트 A에는 여러 가지 종속성이 있지만 프로젝트 A를 가져 오는 프로젝트에서는 일부 또는 하나만 필요할 수 있습니다. 프로젝트 A를 패키징하는 동안 jar 종속성을 제외하는 방법을 찾아서 런타임에 프로젝트 B가 필요한 것을 제공하도록 노력하고 있습니다. 테스트 목적으로 프로젝트 A가 독립적으로 실행될 때 의존성을 사용 가능하게하고 싶습니다.

이미 다음을 시도했습니다.

내가 사용하려고 시도 :

<scope>provided</scope>
<optional>true</optional>

아직도 항아리는 최종 유물에서 끝납니다.

또한 다음을 spring-boot-maven-plugin에 추가해 보았습니다.

           <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <excludeArtifactIds>spring-boot-starter-redis</excludeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

이렇게하면 스프링 부트 종속성이 제거되지만이 종속성을 가진 자식을위한 항아리는 최종 아티팩트로 끝납니다.

해결법

  1. ==============================

    1.현재 프로젝트에서는 JEE 서버에 배포해야하는 애플리케이션 용 war 파일을 생성해야한다는 요구 사항이 있습니다. war 파일에는 JEE 서버가 이미 제공 한 API 또는 구현을 포함하여 필요한 jar 파일 만 포함되어야합니다.

    현재 프로젝트에서는 JEE 서버에 배포해야하는 애플리케이션 용 war 파일을 생성해야한다는 요구 사항이 있습니다. war 파일에는 JEE 서버가 이미 제공 한 API 또는 구현을 포함하여 필요한 jar 파일 만 포함되어야합니다.

    그러나 테스트 목적으로 Boot가 기본적으로 제공하는 실행 가능한 war 또는 jar 파일을 생성 할 수있는 가능성을 유지하려고합니다.

    이를 위해 모든 옵션 종속성을 제공하도록 설정했습니다. 예를 들어, JDBC 드라이버와 같이 직접적으로 개발에 사용 된 몇 가지 종속성이 있습니다. 배포 된 war 파일에 포함하지 않으려합니다. JEE 서버에서 필요없는 다른 스타터와 라이브러리와의 의존성을 제공하는 부트 메인 스타터도 있습니다. 이것은 spring-boot-starter-tomcat 및 spring-boot-starter-jdbc 스타터의 경우입니다. 우리 프로젝트에서는 pom.xml 파일에 followind 의존성이 있습니다.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc7</artifactId>
      <scope>provided</scope>
    </dependency>
    

    이런 방법으로 원래의 jar / war 파일에는 의존성이 포함되지 않지만, spring boot maven plugin은 lib-provided jar / war 패키지의 폴더에 포함됩니다.

    이러한 종속성은 JEE 서버에서는 볼 수 없지만 패키지 된 응용 프로그램을 필요한 것보다 크게 만듭니다. 해결 방법은 spring boot maven plugin이 다른 이름으로 리 패키징 된 파일을 생성하고 개발 도구를 제외하도록 지시하는 것입니다.

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
          <mainClass>${start-class}</mainClass>
          <classifier>exec</classifier>
      </configuration>
    </plugin>
    

    이 방법으로 Maven은 애플리케이션을위한 두 개의 패키지를 생성 할 것이다.

    귀하의 경우에는 동일한 기술을 사용하여 프로젝트 A가 프로젝트 B에 포함될 패키지를 생성하고 프로젝트 A가 독립 실행 형으로 패키지를 생성 할 수 있습니다.

    Project A가 단독으로 실행되도록 패키지를 만들 필요가 없으며 IDE에서만 테스트하면 pom.xml에서 스프링 부트 Maven 플러그인을 제거 할 수도 있습니다.

  2. ==============================

    2.프로젝트 B pom.xml 내부에서 다음을 수행 할 수 있습니다.

    프로젝트 B pom.xml 내부에서 다음을 수행 할 수 있습니다.

      <dependencies>
        ....
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>projectA</artifactId>
    
            <exclusions>
                <exclusion>
                    <groupId>com.foo.bar</groupId>
                    <artifactId>baz</artifactId>
                </exclusion>
                ....
            </exclusions>
        </dependency>
        .....
       </dependencies>
    
  3. from https://stackoverflow.com/questions/37961730/spring-boot-exclude-dependencies-on-packaging by cc-by-sa and MIT license