在 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 时,我得到了不同的错误。
想知道为什么当我们用不同的技术构建 jar 时抛出的错误会有所不同,以及如何更正错误。
在我的项目上执行 运行 gradle 构建命令提供的 jar 时,我收到错误,我将其解释为没有 class 条目已定义,但我已经在我的 build.gradle 文件中定义为
罐子{
显现 {
属性 'Main-Class':'org.gradle.TestHibernateInsertion'
}
}
以及从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
。使用您自己的公司、协会或其他任何域名。
我正在学习设置 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 构建时,我得到了。
想知道为什么当我们用不同的技术构建 jar 时抛出的错误会有所不同,以及如何更正错误。
在我的项目上执行 运行 gradle 构建命令提供的 jar 时,我收到错误,我将其解释为没有 class 条目已定义,但我已经在我的 build.gradle 文件中定义为
罐子{ 显现 { 属性 'Main-Class':'org.gradle.TestHibernateInsertion' } }
以及从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
。使用您自己的公司、协会或其他任何域名。