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:
and the error I get:
Is there's something wrong with my project structure or what am I missing?
jakarta.persistence
jar actually exist in the server?