다른 프로젝트에서 Spring Boot Jar에 종속성을 추가하려면 어떻게 해야 합니까?
저는 Spring Boot 어플리케이션을 가지고 있으며, 그 어플리케이션으로 Jar를 만들었습니다.은 저의 다다 following입니다.pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- WebJars -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
다른 어플리케이션에서 이 Jar를 사용하고 싶기 때문에 어플리케이션에 이 Jar를 추가했습니다.하지만 내가 그 항아리에 있는 메서드를 호출할 때, 그 메서드는ClassNotFoundException.
이 문제를 해결하려면 어떻게 해야 하나요?Spring Boot JAR에 종속성을 추가하려면 어떻게 해야 합니까?
Boot은 을 실행 , 모든 클래스가 「Spring Boot」JAR내에 됩니다.BOOT-INF/classes 에 있는 라이브러리, " " " " " " " " "BOOT-INF/lib이 Fat JAR을 작성하면 다른 프로젝트에 의존할 수 없게 됩니다.
" " 입니다.
repackage로 교체합니다.이는 앱을 나타내는 모듈의 정상적인 동작이지만 모듈을 다른 모듈의 종속성으로 사용하는 경우에는 재패키지된 모듈에 대한 분류자를 제공해야 합니다.입니다.
BOOT-INF/classes따라서 종속 모듈이 재패키지된 독의 클래스를 로드할 수 없습니다.
종속성으로 사용하기 위해 원래 기본 아티팩트를 유지하려는 경우repackage표표: :
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
이 설정에서는 Spring Boot Maven Plugin은 2개의 JAR을 만듭니다.메인 JAR은 통상적인 Maven 프로젝트와 같으며, 두 번째 JAR은 분류자가 추가되어 실행 가능한 JAR이 됩니다.
Tunaki의 답은 맞지만 Spring Boot 2에서는 작동하지 않습니다.
스프링 부트 1.x
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.20.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
...
</plugin>
스프링 부트 2.x
「 」를 사용하고
spring-boot-starter-parent, . . . . . . . .repackageid " " " " " " " " " " " " " " 이 자동으로 됩니다.repackage에서는, , 할 필요가 있습니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
...
</plugin>
Spring Boot 2의 경우 @Tunaki의 답변은 다음 경우 문서에 따라 약간 수정해야 합니다.spring-boot-starter-parent됩니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
의 「」에 해 주세요.<id>repackage</id>에서 실행에 합니다.spring-boot-starter-parent
spring-boot 프로젝트를 종속성으로 사용하고 동시에 spring-boot jar로 실행하려면 다음 구성을 사용하십시오.다음의 설정에서는, 2개의 목표를 달성할 수 있습니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build information</id>
<goals>
<goal>build-info</goal>
</goals>
</execution>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
이 설정에서는 다음 스크린샷 예시와 같이 2개의 jar가 생성됩니다.
@Tunaki가 말한 것은 대부분 맞지만, 당신의 첫 번째 질문에서 누락된 부분은 다음과 같습니다.
이 ClassNotFoundException을 던집니다.스프링 부트 어플리케이션에서 사용되는 외장형 항아리가 없습니다.
이는 Maven 패키징에서 작성된 FatJAR의 특정 위치에 Spring Boot의 응용 프로그램 실행 방법에 맞는 종속 라이브러리가 지정되어 있기 때문입니다.JAR을 다른 응용 프로그램의 클래스 경로에 추가하는 경우 @Tunaki가 말한 대로 수행하고 종속 JAR 파일도 클래스 경로에 포함해야 합니다.이것을 사용하는 가장 좋은 방법은 Maven Dependency Plugin을 사용하는 것입니다.dependency:copy-dependenciesmojo: 모든 종속성을 폴더에 다운로드하여 다른 응용 프로그램을 컴파일할 때 라이브러리 경로로 지정할 수 있습니다.
maven-assembly-plugin으로 프로젝트를 확장할 수 있습니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
조립이 끝나면 3개의 항아리를 받게 됩니다.메인 프로젝트는 일반적인 Maven 프로젝트와 동일하며, 두 번째 프로젝트는 분류자에 exec을 추가하여 실행 가능한 JAR이 됩니다.세 번째 jar 이름에는 jar-with-dependency가 추가되어 spring boot-starter-web, thymeleaf 등 spring boot 어플리케이션에서 의존관계로 추가된 클래스가 포함됩니다.따라서 spring boot project에서 의존관계를 추가할 필요가 없습니다.
아래 빌드 섹션을 사용하면 다음 세 가지 작업을 수행할 수 있습니다.
- spring-boot-maven-plugin을 사용하여 스프링 부트 항아리 생성
- maven-assembly-plugin을 사용하여 소스 코드를 컴파일한 클래스를 사용하여 일반 jar를 만듭니다.
- 일반 병을 m2 폴더에 로컬로 설치합니다.
일반 jar를 원격 저장소에 배포하려면 배포 플러그인을 구성합니다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <appendAssemblyId>true</appendAssemblyId> <descriptors> <descriptor>src/main/resources/sources-jar-build.xml</descriptor> </descriptors> <finalName>${pom.artifactId}-${pom.version}</finalName> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <executions> <execution> <id>install-file</id> <goals> <goal>install-file</goal> </goals> <configuration> <file>${pom.artifactId}-${pom.version}</file> <artifactId>${pom.artifactId}</artifactId> <groupId>${pom.groupId}</groupId> <version>${pom.version}</version> </configuration> </execution> </executions> </plugin> </plugins> </build>
다음 내용을 "sources-jar-build.xml" 파일의 리소스 폴더에 저장합니다.
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>sources</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>jar</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}/target/classes</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
스프링 부트 버전 2.*에서는 아래 플러그인을 사용합니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
기존의 답변은 모두 다른 프로젝트에 의존해야 하는 Spring Boot 프로젝트가 어플리케이션임을 전제로 하고 있습니다.이러한 질문은 그렇게 표현되어 있기 때문에 충분히 공평합니다.
그러나 기반이 되는 프로젝트가 라이브러리로만 사용되어야 하는 경우(즉, (감지 가능한) 메인 클래스가 포함되지 않음), 재패키징할 필요가 있는 실행 가능한 코드가 전혀 없습니다.
따라서 이 경우 다음과 같이 완전히 재패키징을 생략하는 것이 좋습니다.
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>버전 2.2.5를 사용했는데 작동 중입니다.pom.xml에 추가합니다.
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.5.RELEASE</version>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
배치 런처가 다른 응용 프로그램과 공유되는 jar에 의존하도록 프로젝트를 설정할 수 있습니다.
첫 번째 요청에 따라 다르게 말합니다.
다른 어플리케이션에서 이 Jar를 사용하고 싶기 때문에 어플리케이션에 이 Jar를 추가했습니다.
항아리가 프로젝트 A이고 응용 프로그램이 프로젝트 B라고 가정해 보겠습니다.
여기서 제안하는 것은 A에서 런칭 부품을 제거하고 스프링 부트를 삽입하는 새로운 프로젝트 C에 넣는 것입니다.그것은 거의 A에 의존합니다.
그러면 A는 단순한 항아리가 되었기 때문에 B는 의존관계로 사용할 수 있습니다.
의존관계로 추가할 경우 해당 프로젝트가 필요합니다.<groupId> ,<artifactId> ,<version> 모듈 의 응용 할 수 your pom 른른 。: : 용부부 POM pom부 pom POM 。
<project
<groupId>com.sample</groupId>
<artifactId>sampleapp</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>`
아래와 같은 당신의 의존관계
<dependency>
<groupId>com.sample</groupId>
<artifactId>sampleapp</artifactId>
<version>1.0</version>
</dependency>
언급URL : https://stackoverflow.com/questions/40089443/how-to-add-a-dependency-to-a-spring-boot-jar-in-another-project
'programing' 카테고리의 다른 글
| Spring Boot에서 @Repository 주석이 달린 인터페이스를 자동 연결할 수 없습니다. (0) | 2023.04.05 |
|---|---|
| Angularjs 오류 알 수 없는 공급자 (0) | 2023.04.05 |
| Typescript에 있는 객체의 키와 값의 유형 (0) | 2023.04.05 |
| Maven이 Java 11을 사용하지 않음: 오류 메시지 "Fatal error compiling: invalid target release: 11" (0) | 2023.04.05 |
| C++: nlohmann json을 사용하여 파일에서 json 개체 읽기 (0) | 2023.04.05 |
