maven - 如何在 Intellij Idea 13 中将 Maven 项目部署到 Glassfish Server

标签 maven jakarta-ee jpa intellij-idea ejb

我正在使用 Intellij Idea 13 开发一个示例 Java EE 应用程序。简单地说,我的项目是一个 Maven 项目,并且具有 JPA 端 EJB 模块。但是在 Glassfish 服务器上部署和运行应用程序时出现错误。

我创建了一个名为 SimpleEE 的 Maven 项目,并添加了 JPA、EJB 模块。

这是我的项目结构:

|-SampleEE
|    |+.idea
|    |-src
|    |    |-main
|    |    |    |-java
|    |    |    |    |-beans
|    |    |    |    |   |-MyBean.java
|    |    |    |    |-entities
|    |    |    |        |-Staff.java
|    |    |    |-resources
|    |    |         |-META-INF
|    |    |             |-ejb-jar.xml
|    |    |             |-persistence.xml
|    |    |+test
|    |-pom.xml
|    |-SampleEE.iml
|    |-SampleEE.jpr
|+ExternalLibraries                        

MyBean.java:

package beans;
import entities.Staff;

import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

@Startup
@LocalBean
@Singleton
public class MyBean {
    public MyBean() {
    }

    @PostConstruct
    public void myMain() {
        EntityManager em = Persistence.createEntityManagerFactory("mysqlPU").createEntityManager();
        em.getTransaction().begin();
        Staff staff = new Staff();
        staff.setAge(44);
        staff.setGender("M");
        staff.setSalary(123);
        staff.setName("Staff Name");
        em.persist(staff);
        em.getTransaction().commit();
    }
}

员工.java

package entities;

import javax.persistence.*;

@Entity
public class Staff {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STAFF_ID")
    private int id;

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

    @Column(name = "AGE")
    private Integer age;

    @Column(name = "GENDER")
    private String gender;

    @Column(name = "SALARY")
    private Integer salary;

    @Lob
    @Column(name = "IMAGE", nullable = true)
    private byte[] image;

    // Getters and setters
    // ...       

    @Override
    public int hashCode() {
        // implementation ignored here for simplicity     
    }

    @Override
    public boolean equals(Object o) {
        // implementation ignored here for simplicity   
    }
}

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="mysqlPU">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>entities.Staff</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/dbName"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="mysqlUsername"/>
            <property name="javax.persistence.jdbc.password" value="mysqlPassword"/>
        </properties>
    </persistence-unit>
</persistence>

pom.xml

<?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>
    <groupId>SampleEE</groupId>
    <artifactId>SampleEE</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.1</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.27</version>
        </dependency>
    </dependencies>
</project>

我创建了一个 EJB 应用程序:从项目结构中分解了 Artifact 。在运行/调试配置窗口中,我构建了 Glassfish 配置。但是,当运行此配置时,Idea 提示它无法在 mysql jdbc 驱动程序中找到类,并显示从此错误中出现的错误。服务器已启动但应用程序未部署。 Idea 输出日志中的错误消息片段:

....
[2013-12-13 04:07:31,362] Artifact SampleEE:ejb exploded: Artifact is being deployed, please wait...
[2013-12-13 04:07:33,011] Artifact SampleEE:ejb exploded: Error during artifact deployment. See server log for details.
[2013-12-13 04:07:33,018] Artifact SampleEE:ejb exploded: java.io.IOException: com.sun.enterprise.admin.remote.RemoteFailureException: Error occurred during deployment: Exception while loading the app : javax.ejb.CreateException: Initialization failed for Singleton MyBean. Please see server.log for more details.

Glassfish 日志中的最后一个错误

....
Caused by: Exception [EclipseLink-4003] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error.  Class [com.mysql.jdbc.Driver] not found.
....

我猜库的 jar 文件没有部署。但是我的maven配置是有效的。 M2_HOME设置正确,IDEA解析maven路径。 jar 文件也可以在本地存储库中找到。

我在 Netbeans 中创建了一个相同的结构化项目,并且它运行成功。我不知道我做错了什么或者我缺少什么配置参数。

最佳答案

您需要添加 JavaEE 模块并添加创建 JavaEE Artifact 。然后将您需要的所有库添加到该 Artifact 中。

关于maven - 如何在 Intellij Idea 13 中将 Maven 项目部署到 Glassfish Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568924/

相关文章:

java - maven:没有主要 list 属性

java - 如何以编程方式在 Java 中使用渗透导入 OSM 数据?

java - 使用 Maven 构建的可执行 Jar 无法在运行时解决多个数据库驱动程序的依赖关系

java - 全局 Web 应用程序参数

Java:如何与机器通信?

java - 语句被中止,因为它会导致唯一或主键约束中出现重复的键值

hibernate - 如何编写不带联接的 JPA 2.1 更新条件查询?

maven - 如何将Stash用作Gradle项目的Maven远程存储库?

java - key 'PRIMARY' 的重复条目使用 JPA 持久保存到数据库中

java - 在 CriteriaBuilder 中包含 'case when' 子句