嵌入式 Glassfish v3:以编程方式部署 sun-resources.xml 失败
-
16-09-2020 - |
题
我希望能够使用 Glassfish 嵌入式 API 将 jpa-ejb-web 项目打包为独立应用程序。
要使用 JPA 层,我需要部署 sun-resource.xml 配置,这应该可以通过 asadmin命令 add-resources path\to\sun-resources.xml
. 。我有这个代码来做到这一点:
String command = "add-resources";
ParameterMap params = new ParameterMap();
params.add("", "...\sun-resources.xml" );
CommandRunner runner = server.getHabitat().getComponent(CommandRunner.class);
ActionReport report = server.getHabitat().getComponent(ActionReport.class);
runner.getCommandInvocation(command, report).parameters(params).execute();
但 Glassfish 拒绝了:
15-Jul-2010 16:34:12 org.glassfish.admin.cli.resources.AddResources execute
严重的:添加资源时出现问题
java.lang.Exception: ...\gfembed6930201441546233570tmp\lib\dtds\sun-resources_1_4.dtd (The system cannot find the path specified)
at org.glassfish.admin.cli.resources.ResourcesXMLParser.initProperties(ResourcesXMLParser.java:163)
at org.glassfish.admin.cli.resources.ResourcesXMLParser.<init>(ResourcesXMLParser.java:109)
at org.glassfish.admin.cli.resources.ResourcesManager.createResources(ResourcesManager.java:67)
at org.glassfish.admin.cli.resources.AddResources.execute(AddResources.java:106)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1176)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900(CommandRunnerImpl.java:83)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224)
at javaapplication4.Main.main(Main.java:55)
事实上,没有 lib
指定路径上的目录...
我的代码有问题吗?(我用 glassfish-embedded-all-3.0.1.jar)
谢谢
解决方案
我通过为嵌入式 Glassfish 指定嵌入式文件系统来解决这个问题,并预先填充 /path/to/my/glassfish/lib/dtds
包含丢失文件的文件夹。
EmbeddedFileSystem.Builder efsb = new EmbeddedFileSystem.Builder();
efsb.autoDelete(false);
efsb.installRoot(new File("/path/to/my/glassfish"), true);
EmbeddedFileSystem efs = efsb.build();
Server.Builder builder = new Server.Builder("test");
builder.embeddedFileSystem(efs);
builder.logger(true);
Server server = builder.build();
server.addContainer(ContainerBuilder.Type.all);
server.start();
并要求 Glassfish 在执行结束时不要删除该文件夹。
其他提示
我不确定这是否可能, 跑步 asadmin
使用 Sun GlassFish 嵌入式服务器 API 的命令 没有提到这样的用例(传递一个 sun-resources.xml
).
但我会使用预先配置的 domain.xml
而不是尝试部署 sun-resource.xml
文件,结果应该类似。来自 Sun GlassFish Enterprise Server v3 嵌入式服务器指南:
使用现有的
domain.xml
文件使用现有的
domain.xml
文件避免需要在应用程序中以编程方式配置嵌入式企业服务器。您的应用程序从现有的domain.xml
文件。您可以使用未安装的未安装企业服务器的管理接口来创建此文件。指定一个现有的domain.xml
文件,调用installRoot
,instanceRoot
, , 或者configurationFile
的方法EmbeddedFileSystem.Builder
这些方法的类或组合。
该文档提供了代码示例,展示了如何执行此操作(应该非常简单)。