Я хотел бы смочь упаковать свой jpa-ejb-web как автономное приложение, при помощи Glassfish, встроенного API.
Для использования уровня 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.(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 не удалять папку в конце выполнения.
Я не уверен, что это возможно, Running asadmin
Commands Using the Sun GlassFish Embedded Server API не упоминает такой случай использования (передача sun-resources.xml
).
Но я бы использовал предварительно настроенный domain.xml
вместо того, чтобы пытаться развернуть файл sun-resource.xml
, результат должен быть аналогичным. Из Sun GlassFish Enterprise Server v3 Embedded Server Guide:
Использование существующего
domain.xml
файлаИспользование существующего
domain.xml
файла позволяет избежать необходимости конфигурировать встроенный Enterprise Server программно в вашем приложении. Ваше приложение получает данные конфигурации домена из существующего файлаdomain.xml
. Вы можете создать этот файл с помощью административных интерфейсов установки не встроенного Enterprise Server. Чтобы указать существующийdomain.xml
файл, вызовите командыinstallRoot
,instanceRoot
, orconfigurationFile
методаEmbeddedFileSystem.Builder
класса или комбинацию этих методов.
В документации приведены примеры кода, показывающие, как это сделать (должно быть довольно просто).