在 Gradle 中休眠

Hibernate in Gradle

我正在学习设置 Hibernate-Gradle 项目,我的目录结构如下。

TestHibernateInsertion.java 是应用程序的入口点,它具有以下源代码以将值放入我的 localDB 中。

   public static void main(String[] args)
    {

          Configuration conf = new Configuration().configure   ("../../../resources/org/gradle/hibernate.cfg.xml");

          ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();

          SessionFactory sf = conf.buildSessionFactory(serviceRegistry);
          Session session = sf.openSession();
          Person p = new Person(2132);
          session.persist(p);
          Transaction transact = session.beginTransaction();
          transact.commit();
          session.close();
          System.out.println("Done");
    }

Gradle 构建成功,但是当我通过 Gradle 执行 jar 构建时,我得到了。 当我从 eclipse 中将整个项目导出为可运行的 jar 时,我得到了不同的错误。

  1. 想知道为什么当我们用不同的技术构建 jar 时抛出的错误会有所不同,以及如何更正错误。

  2. 在我的项目上执行 运行 gradle 构建命令提供的 jar 时,我收到错误,我将其解释为没有 class 条目已定义,但我已经在我的 build.gradle 文件中定义为

    罐子{ 显现 { 属性 'Main-Class':'org.gradle.TestHibernateInsertion' } }

  3. 以及从Eclipse执行导出的runnable jar的错误,看起来是相对路径错误,但我不知道如何解决它(也使用了getResource()方法。)怎么办我们从具有相对路径的主源代码文件中引用资源文件夹中的 xml 文件。

你所做的有两个主要问题。

第一个是 Java 库如何工作的理解问题。当您编译程序并生成一个 jar 文件时,将库作为​​依赖项,编译器只会检查您是否正确使用了库中的 类 和方法,并且生成的 jar 文件不包含所有代码从图书馆。 jar 文件包含的是您自己的 类 和资源。所以你仍然需要在运行时在类路径中拥有这些库。这意味着启动应用程序的命令行应类似于

java -cp lib/myjar.jar;lib/hibernate.jar;lib/javassist.jar;... org.gradle.TestHibernateInsertion

你的代码依赖的所有库,以及库依赖的库等等(递归)都需要在类路径中。

如果您创建可执行 jar 文件,则 jar 文件的清单必须包含一个类路径条目,列出该 jar 文件所需的所有 jar 文件的相对路径。

您犯的第二个错误是您假设 configure() 方法采用文件的相对路径。它没有。它需要的是从类路径到资源的路径。 ClassLoader 使用此资源路径来加载资源。所以路径应该看起来像 "org/gradle/hibernate.cfg.xml".

最后,除非你正在为 gradle 项目做贡献,否则你不应该使用包 org.gradle。使用您自己的公司、协会或其他任何域名。