Совсем недавно, возможно, в конце прошлого года, команда разработчиков с открытым исходным кодом GlassFish выпустила бета-версию GlassFish 4.0 beta 72 в качестве продвинутой сборки . Арун Гупта опубликовал в своем блоге статью о координатах Maven для GlassFish 4 .0 beta 72 . Этот выпуск был значительным, потому что команда опубликовала артефакты в хранилище Maven.
В этом, 2013 году, я являюсь автором готовящегося к выходу Руководства пользователя по Java EE 7, поэтому очень важно исследовать новейшую версию GlassFish, тем более что это эталонная реализация спецификации. Я хочу на самом деле исследовать и исследовать, как далеко работают последние спецификации Java Servlets 3.1, Web Sockets и JAX-RS на сервере.
Вот скрипт сборки Gradle, который я написал вчера вечером для запуска приложения GlassFish Embedded:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
apply plugin: 'java'apply plugin: 'maven'apply plugin: 'eclipse'apply plugin: 'idea'group = 'com.javaeehandbook.book1'archivesBaseName = 'ch06-servlets-basic'version = '1.0'repositories { mavenCentral() maven { } maven { }}dependencies { compile 'org.glassfish.main.extras:glassfish-embedded-all:4.0-b72' compile 'javax:javaee-api:7.0-b72' testCompile 'junit:junit:4.10'}// Override Gradle defaults - a force an exploded JAR viewsourceSets { main { output.resourcesDir = 'build/classes/main' output.classesDir = 'build/classes/main' } test { output.resourcesDir = 'build/classes/test' output.classesDir = 'build/classes/test' }}task(run, dependsOn: 'classes', type: JavaExec) { description = 'Runs the main application' main = 'je7hb.common.webcontainer.embedded.glassfish.EmbeddedRunner' classpath = sourceSets.main.runtimeClasspath} |
Ключом к сценарию сборки является порядок зависимостей. Я обнаружил, что glassfish-embedded-all должна была быть первой зависимостью в списке, в противном случае возникла бы исключительная ситуация ValidationException из банка Hibernate Validator (bean validator). Сообщение об исключении было 'javax.validation.ValidationException: Unable to load Bean Validation provider' .
Сборка Gradle также ссылается на Java-репозитории GlassFish, что является вторым ключевым моментом. Вот EmbeddedRunner, код приложения Java:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
package je7hb.common.webcontainer.embedded.glassfish;import org.glassfish.embeddable.*;import java.io.*;import java.util.*;import java.util.concurrent.atomic.AtomicBoolean;public class EmbeddedRunner { private int port; private AtomicBoolean initialized = new AtomicBoolean(); private GlassFish glassfish; public EmbeddedRunner(int port) { this.port = port; } public EmbeddedRunner init() throws Exception{ if ( initialized.get() ) { throw new RuntimeException('runner was already initialized'); } BootstrapProperties bootstrapProperties = new BootstrapProperties(); GlassFishRuntime glassfishRuntime = GlassFishRuntime.bootstrap(bootstrapProperties); GlassFishProperties glassfishProperties = new GlassFishProperties(); glassfishProperties.setPort('http-listener', port); String [] paths = System.getProperty('java.class.path').split(File.pathSeparator); for (int j=0; j<paths.length; ++j) { System.out.printf('classpath[%d] = %s\n', j, paths[j]); } glassfish = glassfishRuntime.newGlassFish(glassfishProperties); initialized.set(true); return this; } private void check() { if ( !initialized.get() ) { throw new RuntimeException('runner was not initialised'); } } public EmbeddedRunner start() throws Exception{ check(); glassfish.start(); return this; } public EmbeddedRunner stop() throws Exception{ check(); glassfish.stop(); return this; } public static void main(String args[]) throws Exception { EmbeddedRunner runner = new EmbeddedRunner(8080).init().start(); Thread.sleep(1000); runner.stop(); }} |
Класс выполняет встроенный GlassFish как начало сборки без контейнеров , что и придумал Джеймс Уорд и другие. Этот класс запускает GlassFish, ждет одну секунду, а затем снова выключает его. Код работает с Gradle, вызывая в командной строке Gradle Run или через IDE. Я использовал идею командной строки для создания файлов проекта IDEA.
Вот пример вывода из IntelliJ IDEA 12:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/bin/java -Didea.launcher.port=7537 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 11.app/bin" -Dfile.encoding=UTF-8 -classpath "/Users/Developer/Documents/IdeaProjects/javaee7-handbook/ch06/servlets-basic/out/production/servlets-basic:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/javafx-doclet.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/htmlconverter.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/JObjC.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/Developer/.gradle/caches/artifacts-15/filestore/org.glassfish.main.extras/glassfish-embedded-all/4.0-b72/jar/942b982d5c005806a08843d2a1f411f278c04077/glassfish-embedded-all-4.0-b72.jar:/Users/Developer/.gradle/caches/artifacts-15/filestore/javax/javaee-api/7.0-b72/jar/56d50eaa8d21c2f70394f607efc1aa27c360141d/javaee-api-7.0-b72.jar:/Users/Developer/.gradle/caches/artifacts-15/filestore/javax.activation/activation/1.1/jar/e6cb541461c2834bdea3eb920f1884d1eb508b50/activation-1.1.jar:/Users/Developer/.gradle/caches/artifacts-15/filestore/com.sun.mail/javax.mail/1.4.6-rc1/jar/5c5de8592e570afb595a8be727b484d438b49d69/javax.mail-1.4.6-rc1.jar:/Applications/IntelliJ IDEA 11.app/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain je7hb.common.webcontainer.embedded.glassfish.EmbeddedRunnerclasspath[0] = /Users/Developer/Documents/IdeaProjects/javaee7-handbook/ch06/servlets-basic/out/production/servlets-basicclasspath[1] = /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/lib/ant-javafx.jarclasspath[26] = /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/ext/zipfs.jarclasspath[27] = /Users/Developer/.gradle/caches/artifacts-15/filestore/org.glassfish.main.extras/glassfish-embedded-all/4.0-b72/jar/942b982d5c005806a08843d2a1f411f278c04077/glassfish-embedded-all-4.0-b72.jarclasspath[28] = /Users/Developer/.gradle/caches/artifacts-15/filestore/javax/javaee-api/7.0-b72/jar/56d50eaa8d21c2f70394f607efc1aa27c360141d/javaee-api-7.0-b72.jarclasspath[29] = /Users/Developer/.gradle/caches/artifacts-15/filestore/javax.activation/activation/1.1/jar/e6cb541461c2834bdea3eb920f1884d1eb508b50/activation-1.1.jarclasspath[30] = /Users/Developer/.gradle/caches/artifacts-15/filestore/com.sun.mail/javax.mail/1.4.6-rc1/jar/5c5de8592e570afb595a8be727b484d438b49d69/javax.mail-1.4.6-rc1.jarclasspath[31] = /Applications/IntelliJ IDEA 11.app/lib/idea_rt.jarFound populator: org.glassfish.kernel.embedded.EmbeddedDomainXmlJan 31, 2013 10:05:12 AM org.glassfish.security.services.impl.authorization.AuthorizationServiceImpl initializeINFO: Authorization Service has successfully initialized.Jan 31, 2013 10:05:12 AM org.hibernate.validator.internal.util.Version <clinit>INFO: HV000001: Hibernate Validator 5.0.0.Alpha1Jan 31, 2013 10:05:13 AM com.sun.enterprise.config.modularity.StartupConfigBeanOverrider postConstructINFO: Starting the config overriding procedureJan 31, 2013 10:05:13 AM com.sun.enterprise.config.modularity.StartupConfigBeanOverrider postConstructINFO: Finished the config overriding procedureJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy startINFO: Grizzly Framework 2.3 started in: 18ms - bound to [/0.0.0.0:8,080]Jan 31, 2013 10:05:13 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy startINFO: Grizzly Framework 2.3 started in: 3ms - bound to [/0.0.0.0:8,081]Jan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRootINFO: Admin Console Adapter: context root: /adminJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRootINFO: Admin Console Adapter: context root: /adminJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRootINFO: Admin Console Adapter: context root: /adminJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.server.AppServerStartup$StartupActivator awaitCompletionINFO: Undefined Product Name - define product and version info in config/branding 0.0.0 (0) startup time : Embedded (1,204ms), startup services(856ms), total(2,060ms)Jan 31, 2013 10:05:13 AM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread runINFO: JMXStartupService has disabled JMXConnector systemJan 31, 2013 10:05:13 AM com.sun.enterprise.connectors.jms.util.JmsRaUtil getInstalledMqVersionWARNING: RAR7000 : Check for a new version of MQ installation failed : /var/folders/kr/vj5fd5s91g76_t348ndnbtxr0000gn/T/gfembed883899172293116872tmp/lib/install/applications/jmsra/../imqjmsra.rar (No such file or directory):/var/folders/kr/vj5fd5s91g76_t348ndnbtxr0000gn/T/gfembed883899172293116872tmp/lib/install/applications/jmsra/imqjmsra.rarJan 31, 2013 10:05:14 AM org.glassfish.admin.mbeanserver.JMXStartupService shutdownINFO: JMXStartupService and JMXConnectors have been shut down.JdbcRuntimeExtension, getAllSystemRAResourcesAndPools = [GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool]Jan 31, 2013 10:05:15 AM com.sun.enterprise.v3.server.AppServerStartup stopINFO: Shutdown procedure finishedProcess finished with exit code 0 |
Вы должны увидеть что-то из вышеприведенного вывода в IDE, если все делаете правильно. Казалось бы, нам нужно быть настороже до JDK 9, чтобы избежать проблем с загрузкой пути к классам. Моя книга о руководстве пользователя Java EE 7 запланирована на лето 2013 года.
Ссылка: GlassFish 4 рекламировал сервер сборки, Gradle и Embedded Application от нашего партнера JCG Питера Пилигрима в блоге Питера Пилигрима .