定位包含javax.persistence类的JAR的独立于JavaEE服务器的方法



我有一个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注释来验证类型。

当我尝试这样做时,我得到了一个错误:

在类型javax.persistence.Table中找不到注释方法name():找不到javax.persstence.Table的类文件

因此,我需要以某种方式将包含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安装中)从哪里获得包含javax.persistence类的JAR吗?

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

如果您正在部署到JavaEEAppServer,那么带有@Entity注释的JAR将已经在应用程序的运行时类路径中。您不应该在代码中加载任何JAR文件(正如您在评论中所描述的那样)。

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

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

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

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

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

最新更新