Java EE 服务器独立的方式来定位包含 javax.persistence 类的 JAR

标签 java jakarta-ee jpa java-compiler-api

我有一个 Java EE 应用程序,您可以在其中定义某种类型的变量。为了验证值表达式对其类型有效,我创建了一个包含小类的字符串:

public class CompilableExpression {
  private <type> expression = <expression>;
}

.. 并尝试使用 JavaCompiler 编译它:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
Iterable<? extends JavaFileObject> compilationUnits = 
  Arrays.asList(stringContainingCompilableExpression);
CompilationTask task = compiler.getTask(
  null, null, diagnostics, options, null, compilationUnits
);
task.call();

如果您使用类型:String,则效果很好。和表达式:"my string" ,或输入:Integer和表达式:10 .

我还想使用 @Entity 验证类型注解。

当我尝试这样做时,出现错误:

Cannot find annotation method name() in type javax.persistence.Table: class file for javax.persistence.Table not found

所以,我需要添加一个包含 javax.persistence 的 JAR以某种方式将类添加到类路径。有没有通用的方法可以找到这个 JAR?我正在使用 GlassFish,并且不想构建仅限 GlassFish 的解决方案。

或者将其作为正常(未提供)依赖项添加到我的项目中?

更新

我试图至少在 GlassFish 中找到该位置(位于 ~/glassfish-4.1/glassfish ):

find ./ -name '*ee*.jar'          
./lib/javaee.jar
./modules/security-ee.jar
./modules/amx-javaee.jar
./modules/javaee-kernel.jar
./modules/autostart/osgi-javaee-base.jar
./modules/autostart/osgi-ee-resources.jar
./modules/deployment-javaee-full.jar
./modules/deployment-javaee-core.jar
./modules/glassfish-ee-api.jar
./modules/javax.management.j2ee-api.jar

我最好的猜测是使用./lib/javaee.jar ,但是当我检查内容时它几乎是空的:

$JAVA_HOME/bin/jar tf ./lib/javaee.jar
META-INF/
META-INF/MANIFEST.MF
META-INF/maven/
META-INF/maven/org.glassfish.main.extras/
META-INF/maven/org.glassfish.main.extras/javaee/
META-INF/maven/org.glassfish.main.extras/javaee/pom.xml
META-INF/maven/org.glassfish.main.extras/javaee/pom.properties

有谁知道在哪里(在 GlassFish 安装中)获取 JAR,包括 javax.persistence类(class)?

最佳答案

您要查找的 JAR 位于 $GLASSFISH_HOME/glassfish/modules/javax.persistence.jar

如果您要部署到 JavaEE 应用服务器,则带有 @Entity 注释的 JAR 将已位于应用程序的运行时类路径中。您不必在代码中加载任何 JAR 文件(如您在评论中所述)。

在开发过程中,您通常会在 IDE 中配置应用程序服务器,并且该过程应将带有注释的 JAR 包含到您的编译类路径中。

您可能需要手动将其包含在项目编译类路径/应用程序服务器库类路径中,具体取决于 IDE 处理此问题的方式。对于 Glassfish,所有 API JAR 都位于您在模块目录中查找的位置。

尽管这将您的项目与在相对于应用程序服务器安装的特定位置查找要编译的 JAR 联系起来,但我发现它仍然是比将 JAR 复制到项目中进行编译更好的方法。这可确保您针对部署到应用程序服务器的正确 JAR 进行编译,并且只要这些是 JavaEE API,您的应用程序就可以很好地部署到任何应用程序服务器中。

您还可以将项目设置为使用 Maven,包括持久性 API 所需的 deps,它会在您的 Maven 缓存中找到编译时 deps。

您可能还想查看Jar Explorer它可以让你在 JAR、JAR 文件夹等中搜索类等。查找这些东西非常方便。

关于Java EE 服务器独立的方式来定位包含 javax.persistence 类的 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833338/

相关文章:

想要与 Servlet 交互的 Java 控制台程序

jakarta-ee - java.io.WriteAbortedException : writing aborted; java. io.NotSerializedException

java - Hibernate 多对多 - 保存时未填充连接表

java - 将 JPA 与 Oracle 一起使用并按小时分组时出现问题

java - 在 Java 中使用 Object.equals() 是一种可接受的做法吗?

java - Spring 连接池问题

java - Glassfish 服务器中的记录器错误

java - 什么是 NullPointerException,我该如何解决?

java - opencv Mat 对象

java - 在子类中创建复合主键 (JPA)