I created a Maven project for Spring Boot. I have a lot of Spring dependencies and one main class:
package com.vastserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyArtifactApplication { public static void main(String[] args) { // SpringApplication.run(MyArtifactApplication.class, args); System.out.println("hello!"); } }
The folder structure of src
directory is:
. └── main ├── java │ └── com │ └── vastserver │ └── MyArtifactApplication.java └── resources └── application.properties
In my pom.xml I use maven-assembly-plugin
in order to build my project in a standalone .jar file. Even though I triple checked that the directory structure and main class file appear correctly in the pom.xml I keep getting the error: Error: Could not find or load main class com.vastserver.MyArtifactApplication
when I run mvn package
and then java -cp target/vast-ad-server-artifactId-1.0-SNAPSHOT-jar-with-dependencies.jar com.vastserver.MyArtifactApplication
or mvn exec:exec
. The main class does work if I run it from Intellij so I know the code is not the problem but rather Maven build settings. I lost at where my problem could be.
My pom.xml looks as follows:
<?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <maven.compiler.release>11</maven.compiler.release> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <mainClass>com.vastserver.MyArtifactApplication</mainClass> <descriptorRef>jar-with-dependencies</descriptorRef> <targetSnapshot>target/vast-ad-server-artifactId-1.0-SNAPSHOT</targetSnapshot> <targetWithDependencies>${targetSnapshot}-${descriptorRef}.jar</targetWithDependencies> </properties> <groupId>com.vastserver</groupId> <artifactId>vast-ad-server-artifactId</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> </dependencies> <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> <archive> <manifest> <mainClass>${mainClass}</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>${descriptorRef}</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.3.2</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>-cp</argument> <argument>${targetWithDependencies}</argument> <argument>${mainClass}</argument> </arguments> </configuration> </plugin> </plugins> </build> </project>
Advertisement
Answer
I think you should check the directory structure of the artifact that was built by maven. Usually, spring boot artifacts are prepared by a special spring boot plugin and not by a maven assembly plugin.
Although it shares the “jar” suffix, it’s not really a jar, it has special classloader to load classes from BOOT-INF/lib
folder.
I’ve already provided a detailed answer on what happens exactly when the spring boot application starts here but bottom line if you use assembly plugin you’ll have to prepare both manifest file and a fairly complicated structure of folders. Frankly, I think you should use spring boot plugin as a first resort to build spring boot applications.