1

When I run the application (Hibernate, JPA) in IntelliJ IDEA, everything works without errors, but the jar file created by Maven when launched on the server gives an error:

java.lang.NoClassDefFoundError: jakarta/persistence/Persistence

I don't know much about running the application on the server, please tell me what I'm missing. Dependencies have been added, the configuration seems to be all there too.

Here is my code:

pom.xml

<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>

    <distributionManagement>
        <repository>
            <uniqueVersion>false</uniqueVersion>
            <id>corp1</id>
            <name>DataModel</name>
            <url>file:///home/sgt-user/.m2</url>
            <layout>default</layout>
        </repository>
    </distributionManagement>

    <groupId>org.example</groupId>
    <artifactId>port-reader</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.sgt.EchoMultiServer</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core-jakarta</artifactId>
            <version>5.6.15.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
            <version>3.1.0</version>
        </dependency>

    </dependencies>


    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

Model:

import jakarta.persistence.*;

import java.util.Objects;

@Entity
@Table(name = "meter")
public class DataModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", nullable=false, unique=true)
    private Long id;

    @Column(name="imei")
    private String imei;

    @Column(name="readCycle")
    private int readCycle;

    @Column(name="dataCount")
    private int dataCount;

    @Column(name="volume")
    private double volume;

    @Column(name="interval1")
    private int interval1;

    @Column(name="interval2")
    private int interval2;

    @Column(name="interval3")
    private int interval3;

    @Column(name="batP")
    private int batP;

    @Column(name="batV")
    private int batV;

    @Column(name="chsum")
    private int chsum;

    public DataModel(){}

    public DataModel(String imei, int readCycle, int dataCount, double volume, int interval1, int interval2, int interval3, int batP, int batV, int chsum) {
        this.imei = imei;
        this.readCycle = readCycle;
        this.dataCount = dataCount;
        this.volume = volume;
        this.interval1 = interval1;
        this.interval2 = interval2;
        this.interval3 = interval3;
        this.batP = batP;
        this.batV = batV;
        this.chsum = chsum;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof DataModel dataModel)) return false;
        return readCycle == dataModel.readCycle && dataCount == dataModel.dataCount && Double.compare(dataModel.volume, volume) == 0 && interval1 == dataModel.interval1 && interval2 == dataModel.interval2 && interval3 == dataModel.interval3 && batP == dataModel.batP && batV == dataModel.batV && chsum == dataModel.chsum && Objects.equals(id, dataModel.id) && Objects.equals(imei, dataModel.imei);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, imei, readCycle, dataCount, volume, interval1, interval2, interval3, batP, batV, chsum);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getImei() {
        return imei;
    }

    public void setImei(String imei) {
        this.imei = imei;
    }

    public int getReadCycle() {
        return readCycle;
    }

    public void setReadCycle(int readCycle) {
        this.readCycle = readCycle;
    }

    public int getDataCount() {
        return dataCount;
    }

    public void setDataCount(int dataCount) {
        this.dataCount = dataCount;
    }

    public double getVolume() {
        return volume;
    }

    public void setVolume(double volume) {
        this.volume = volume;
    }

    public int getInterval1() {
        return interval1;
    }

    public void setInterval1(int interval1) {
        this.interval1 = interval1;
    }

    public int getInterval2() {
        return interval2;
    }

    public void setInterval2(int interval2) {
        this.interval2 = interval2;
    }

    public int getInterval3() {
        return interval3;
    }

    public void setInterval3(int interval3) {
        this.interval3 = interval3;
    }

    public int getBatP() {
        return batP;
    }

    public void setBatP(int batP) {
        this.batP = batP;
    }

    public int getBatV() {
        return batV;
    }

    public void setBatV(int batV) {
        this.batV = batV;
    }

    public int getChsum() {
        return chsum;
    }

    public void setChsum(int chsum) {
        this.chsum = chsum;
    }
}

JpaService:

import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;


public class JpaService {

    private static JpaService instance;

    private EntityManagerFactory entityManagerFactory;

    private JpaService(){
        entityManagerFactory = Persistence.createEntityManagerFactory("port-reader");

    }

    public static synchronized JpaService getInstance() {
        return instance == null ? instance = new JpaService() : instance;
    }

    public void shutdown(){
        if(entityManagerFactory != null){
            entityManagerFactory.close();
        }

    }

    public EntityManagerFactory getEntityManagerFactory(){
        return entityManagerFactory;
    }
}

persistence.xml:

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="port-reader" transaction-type="RESOURCE_LOCAL">
<!--        <provider>org.hibernate.ejb.HibernatePersistence</provider>-->
        <properties>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/sgt"/>
            <property name="jakarta.persistence.jdbc.user" value="sgt-user"/>
            <property name="jakarta.persistence.jdbc.password" value="sgtpass"/>
            <property name="jakarta.persistence.schema-generation.database.action" value="none"/>
        </properties>
    </persistence-unit>
</persistence> 

This is my project structure:

project structure

and the error I get:

error

Is there's something wrong with my project structure or what am I missing?

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Elena
  • 19
  • 5
  • How do you deploy on the server? – Erwin Apr 07 '23 at 04:04
  • @Erwin, im just running it with java -jar nameofjar.jar – Elena Apr 10 '23 at 00:02
  • can you check if the `jakarta.persistence` jar actually exist in the server? – Erwin Apr 10 '23 at 02:15
  • @Erwin i have to have it on server? i thought it has to be provided with my java application in builded jar.. sorry if im wrong. can you tell me where do i have to put it? – Elena Apr 10 '23 at 04:29
  • is it in the builded jar? have you check inside the jar? – Erwin Apr 10 '23 at 06:35
  • yeah, it include jakarta.persistence – Elena Apr 10 '23 at 07:24
  • I think the problem is in the jar-loading ordering. Check your [manifest](https://stackoverflow.com/a/53025261/12083015) to see the ordering, and I think it related with maven dependencies, try to move `jakarta.persistence` in the first order and then rebuild the jar – Erwin Apr 10 '23 at 09:29
  • @Erwin You were right! Once i put jakarta.persistence on first place it worked! I had no idea its matters, i only thought it just has to be. Thank you a lot! i thought i'm going crazy – Elena Apr 11 '23 at 01:03
  • Add `true` to the `` configuration of the `maven-jar-plugin`. – Mark Rotteveel Apr 11 '23 at 09:28
  • @MarkRotteveel, thanks, problem fixed with Erwin comment above – Elena Apr 12 '23 at 04:27
  • @Elena did you solve it by re-ordering maven dependencies? – Damien Cooke May 10 '23 at 12:06
  • 1
    @DamienCooke not only re-ordering, i deleted all dependencies and add again, and make sure i put jakarta.persistence in the first order and it worked – Elena May 11 '23 at 01:42
  • You may have had a 2.x version of the library on your classpath, which had all the classes in the old `javax.persistence` package (ostensibly to ease migration, although it actually just made it harder AND more confusing). – Matthew Read May 20 '23 at 02:43

1 Answers1

-3

1.Try With Another JDK Version like AWS Corette 11 example https://aws.amazon.com/corretto/ 2.Check did you Correct Import Project 3Try to mvn clean ,mvn install

lpdevlop
  • 7
  • 4