我希望能够使用 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 这些方法的类或组合。

该文档提供了代码示例,展示了如何执行此操作(应该非常简单)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top