Search code examples
jdbcjakarta-eeglassfishjava-ee-6glassfish-embedded

Embedded Glassfish v3: deploying sun-resources.xml programmatically fails


I would like to be able to package my jpa-ejb-web project as a standalone application, by using Glassfish embedded API.

To use the JPA layer, I need to deploy the sun-resource.xml configuration, which should be possible with the asadmin command add-resources path\to\sun-resources.xml. I've this code to do it:

    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();

but Glassfish refuses it with:

15-Jul-2010 16:34:12 org.glassfish.admin.cli.resources.AddResources execute

SEVERE: Something went wrong in add-resources

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)

and indeed, there is no lib directory on the indicated path ...

is there something wrong in my code? (I use glassfish-embedded-all-3.0.1.jar)

Thanks


Solution

  • I solved it by specifying an Embedded File System for the embedded Glassfish, and prepopulated the /path/to/my/glassfish/lib/dtds folder with the files which were missing.

            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();
    

    and asking Glassfish not to delete the folder at the end of the execution.