에러

repackage failed: Unable to find main class

 

 

에러 상세

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.8.RELEASE:repackage (repackage) on project OmniOneData: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.8.RELEASE:repackage failed: Unable to find main class -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

 

 

환경

OS : macOS Mojave
IDE : Eclipse
Build : Maven

JDK : 1.8

 

 

상황

java 프로젝트를 jar로 빌드하려는데, 위와 같은 에러가 발생했다. 참고로, 위 에러는 환경에 따라 발생할 수도 않할 수도 있다. 현재 프로젝트는 처음부터 개발하던 것이 아닌, 외부에서 미리 개발된 프로젝트를 가져와서 작성자의 PC에서 빌드하려고 시도한 것이다. 기존 외부에서 개발되던 PC 환경에서는 빌드가 정상적으로 됬지만, 글쓴이의 PC로 가져와서는 위 에러와 함께 빌드를 실패한 것이다.

 

pom.xml

<project>
…
<properties>
	<java.version>1.8</java.version>
</properties>
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
</project>

 

 

원인

Spring Boot의 “spring-boot-maven-plugin” 플러그인(Plug-In)을 잘못사용해서 발생한 에러이다. 이 플러그인은 실행가능한 jar (executable or runnable jar)파일을 만들려고 시도하는 경우에 해당 jar를 생성하기 위한 java 소스(source)파일들 중에 메인(main)함수가 존재하지 않는 경우에 발생하는 것이다. 

 

 

해결

위 에러를 해결하기 위해 찾은 몇가지 방법들을 소개한다. 아래 소개된 방법들 중에 개발중인 프로젝트 환경의 상황에 맞는 방법을 사용하면 된다. 참고로, 글쓴이는 위 에러를 없애기 위한 아래 방법들을 하나씩 적용해서 모두 확인을 해봤고, 아래 방법 중 [방법4]를 사용해서 에러를 해결하였다. 

 

  • [방법1] main 이 존재하는 파일을 생성한다. (main() 함수 추가)
  • [방법2] jar를 실행하기 위한 클래스를 별도로 지정한다. (<start-class> 사용)
  • [방법3] jar를 실행하기 위한 클래스를 별도로 지정한다. (<configuration> 사용)
  • [방법4] main 클래스가 없더라도 무시하고 빌드시킨다. (<configuration> 사용)
  • [방법5] 부모, 자식관계를 사용해서 빌드시킨다. (<pluginManagement> 사용)

 

[방법1] main 이 존재하는 파일을 생성한다. (main() 함수 추가)

  1. jar에 포함시키는 java 파일 중 하나를 생성한다. (새로 생성하지 않고 기존 java 파일을 사용해도 상관없다.)
  2. main() 함수를 작성한다.
  3. 다시 빌드한다. (=Maven Install)

Joker.java (예시)

public class Joker {
	public static void main(String[] args) {
		…		
	}
}

 

 

[방법2] jar를 실행하기 위한 클래스를 별도로 지정한다. (<start-class> 사용)

  1. pom.xml 파일의 <properties>안에 <start-class>를 추가한다.
  2. <start-class> 안에 main() 함수가 포함된 클래스를 작성한다. (이때, 반드시 jar 내에 포함되어 있을 필요는 없기 때문에, 아래 예시처럼 패키지 이름만 적어도 된다.)
  3. 다시 빌드한다. (=Maven Install)

pom.xml

<project>
…
<properties>
	<java.version>1.8</java.version>
	<start-class>joker.package.main</start-class>
</properties>
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
</project>

 

 

[방법3] jar를 실행하기 위한 클래스를 별도로 지정한다. (<configuration> 사용)

  1. pom.xml 파일의 <plugin>안에 <configuration>을 추가한다.
  2. <configuration> 안에 <mainClass>를 추가한다.
  3. <mainClass> 안에 main() 함수가 포함된 클래스를 작성한다. 
  4. 다시 빌드한다. (=Maven Install)

 

pom.xml

<project>
…
<properties>
	<java.version>1.8</java.version>
</properties>
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
		            <mainClass>joker.package</mainClass> 
		        </configuration>
		</plugin>
	</plugins>
</build>
</project>

 

 

[방법4] main 클래스가 없더라도 무시하고 빌드시킨다. (<configuration> 사용)

  1. pom.xml 파일의 <plugin>안에 <configuration>을 추가한다.
  2. <configuration> 안에 <skip>을 추가한다.
  3. <skip> 안에 true를 작성한다. 
  4. 다시 빌드한다. (=Maven Install)

 

pom.xml

<project>
…
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<skip>true</skip>
			</configuration>
		</plugin>
	</plugins>
</build>
</project>

 

[방법5] 부모, 자식 관계를 사용해서 빌드시킨다. (<pluginManagement> 사용)

  1. pom.xml 파일의 <build>안에 <pluginManagement>를 추가한다.
  2. 다시 빌드한다. (=Maven Install)

 

pom.xml

<project>
…
<build>
	<pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</pluginManagement>
</build>
</project>

 

 

참고

stack overflow 해결방법

https://stackoverflow.com/questions/42937577/unable-to-find-main-class-with-maven-on-spring-boot-project-in-eclipse