0

i want to dockerize my maven project. My pom.xml looks like

<?xml version="1.0" encoding="UTF-8"?>

4.0.0

<groupId>de.fhws.biedermann.webshop</groupId>
<artifactId>progPorj</artifactId>
<version>1.0-SNAPSHOT</version>

<build>
    <finalName>webshop</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>de.fhws.biedermann.webshop.Start</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
    </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-declarative-linking</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.7.0</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>jakarta.ws.rs</groupId>
        <artifactId>jakarta.ws.rs-api</artifactId>
        <version>2.1.6</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>28.2-android</version>
    </dependency>
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.36.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180130</version>
    </dependency>

</dependencies>

<properties>
    <maven.compiler.source>16</maven.compiler.source>
    <maven.compiler.target>16</maven.compiler.target>
    <tomcat.version>8.5.13</tomcat.version>
    <jersey.version>2.31</jersey.version>
</properties>

and my dockerfile

#
# Build stage
#
FROM maven:3.8.4-openjdk-17 AS build
COPY . /home/app
RUN mvn -f /home/app/pom.xml clean package

#
# Package stage
#
FROM openjdk:16-alpine3.13
COPY --from=build /home/app/target/webshop.jar /usr/local/lib/webshop.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/webshop.jar"]

When i build this file, everything works, but on running i get an

Error: Unable to initialize main class de.fhws.biedermann.webshop.Start Caused by: java.lang.NoClassDefFoundError: org/apache/catalina/WebResourceRoot

What should i do? Thanks

  • You are mixing classpath-aware jar with fat-jar approaches. descriptorRef is not a part of jar plugin - it is a part of assembly plugin. See https://stackoverflow.com/a/23986765/1570854 – Lesiak Jul 15 '22 at 20:33
  • ok, so which plugin should i use? Which one is the best – Jakob Priesner Jul 15 '22 at 21:47
  • Whichever you like. If you choose classpath-aware jar you need to copy the dependencies, if you choose fat-jar you need to add and configure assembly plugin. Ask your teammates what is more common approach in your company. If you ask me which I like - I would pick fatjar. – Lesiak Jul 16 '22 at 13:18

1 Answers1

0

I think in your build stage you didn't specify your WORKDIR which possibly defaults to /home and your mvn build is in /home/target instead of /home/app/target. Perhaps you can try to add:

...
COPY . /home/app
WORKDIR /home/app  #<==== set correct working directory for maven
RUN mvn -f /home/app/pom.xml clean package
...

This might make your Jar available to the application and it can run.

zer0
  • 2,153
  • 10
  • 12