{"id":980,"date":"2013-01-31T13:22:29","date_gmt":"2013-01-31T12:22:29","guid":{"rendered":"http:\/\/www.xenonique.co.uk\/blog\/?p=980"},"modified":"2013-01-31T13:22:29","modified_gmt":"2013-01-31T12:22:29","slug":"glassfish-4-promoted-build-gradle-and-embedded-application-server","status":"publish","type":"post","link":"https:\/\/www.xenonique.co.uk\/blog\/2013\/01\/31\/glassfish-4-promoted-build-gradle-and-embedded-application-server\/","title":{"rendered":"GlassFish 4 Promoted Build, Gradle and Embedded Application Server"},"content":{"rendered":"<p>Very recently, perhaps towards end of last year, the <a title=\"GlassFish application server project\" href=\"https:\/\/glassfish.java.net\/\"><strong>GlassFish open source team<\/strong><\/a> released <strong>GlassFish 4.0 beta 72<\/strong> as a <strong><a title=\"GlassFish 4 Promoted Builds\" href=\"https:\/\/dlc.sun.com.edgesuite.net\/glassfish\/4.0\/\">promoted build<\/a><\/strong>. <strong>Arun Gupta<\/strong> posted an article on the <a title=\"Java EE 7 Maven GlassFish 4.0 Beta 72 Coordinates\" href=\"https:\/\/blogs.oracle.com\/arungupta\/entry\/java_ee_7_maven_application\">Maven coordinates for the GlassFish 4 .0 beta 72<\/a> on his blog. This release was significant because the team published the artifacts into a maven repository.<\/p>\n<p>This year, 2013, I am the author of a up and coming <strong>Java EE 7 User Guide<\/strong> and so it is important that I investigate the latest GlassFish, especially since it is the reference implementation of the specification. I want to actually research and investigate how far the latest Java Servlets 3.1, Web Sockets and JAX-RS specifications behave in the server.<\/p>\n<p>Here is a <strong>Gradle<\/strong> build script that I wrote last night to execute an GlassFish Embedded application:<\/p>\n<pre class=\"brush: groovy; title: ; notranslate\" title=\"\">\r\napply plugin: 'java'\r\napply plugin: 'maven'\r\napply plugin: 'eclipse'\r\napply plugin: 'idea'\r\n\r\ngroup = 'com.javaeehandbook.book1'\r\narchivesBaseName = 'ch06-servlets-basic'\r\nversion = '1.0'\r\n\r\nrepositories {\r\n mavenCentral()\r\n maven {\r\n   url 'https:\/\/maven.java.net\/content\/groups\/promoted'\r\n }\r\n maven {\r\n   url 'https:\/\/repository.jboss.org\/nexus\/content\/groups\/public'\r\n }\r\n}\r\n\r\ndependencies {\r\n compile 'org.glassfish.main.extras:glassfish-embedded-all:4.0-b72'\r\n compile 'javax:javaee-api:7.0-b72'\r\n testCompile 'junit:junit:4.10'\r\n}\r\n\r\n\/\/ Override Gradle defaults - a force an exploded JAR view\r\nsourceSets {\r\n main {\r\n   output.resourcesDir = 'build\/classes\/main'\r\n   output.classesDir = 'build\/classes\/main'\r\n }\r\n test {\r\n   output.resourcesDir = 'build\/classes\/test'\r\n   output.classesDir = 'build\/classes\/test'\r\n }\r\n}\r\n\r\ntask(run, dependsOn: 'classes', type: JavaExec) {\r\n description = 'Runs the main application'\r\n main = 'je7hb.common.webcontainer.embedded.glassfish.EmbeddedRunner'\r\n classpath = sourceSets.main.runtimeClasspath\r\n}\r\n<\/pre>\n<p>The key to the build script is the order of the dependencies. I found that the <code>glassfish-embedded-all<\/code> had to be first dependency on the list, otherwise there would be ValidationException from the Hibernate Validator (bean validator) jar not being found. The exception message was <code>\"javax.validation.ValidationException: Unable to load Bean Validation provider\"<\/code>.<\/p>\n<p>The Gradle build also references the GlassFish Java repositories, which is the second key point.<\/p>\n<p>Here is the EmbeddedRunner, the Java application code:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage je7hb.common.webcontainer.embedded.glassfish;\r\n\r\nimport org.glassfish.embeddable.*;\r\nimport java.io.*;\r\nimport java.util.*;\r\nimport java.util.concurrent.atomic.AtomicBoolean;\r\n\r\npublic class EmbeddedRunner {\r\n\r\n private int port;\r\n private AtomicBoolean initialized = new AtomicBoolean();\r\n private GlassFish glassfish;\r\n\r\n public EmbeddedRunner(int port) {\r\n   this.port = port;\r\n }\r\n\r\n public EmbeddedRunner init() throws Exception{\r\n   if ( initialized.get() ) {\r\n     throw new RuntimeException(&quot;runner was already initialized&quot;);\r\n   }\r\n   BootstrapProperties bootstrapProperties = new BootstrapProperties();\r\n   GlassFishRuntime glassfishRuntime = GlassFishRuntime.bootstrap(bootstrapProperties);\r\n\r\n   GlassFishProperties glassfishProperties = new GlassFishProperties();\r\n   glassfishProperties.setPort(&quot;http-listener&quot;, port);\r\n   String [] paths = System.getProperty(&quot;java.class.path&quot;).split(File.pathSeparator);\r\n   for (int j=0; j&lt;paths.length; ++j) {\r\n     System.out.printf(&quot;classpath[%d] = %s\\n&quot;, j, paths[j]);\r\n   }\r\n   glassfish = glassfishRuntime.newGlassFish(glassfishProperties);\r\n   initialized.set(true);\r\n   return this;\r\n }\r\n\r\n  private void check() {\r\n    if ( !initialized.get() ) {\r\n      throw new RuntimeException(&quot;runner was not initialised&quot;);\r\n    }\r\n  }\r\n\r\n  public EmbeddedRunner start() throws Exception{\r\n    check();\r\n    glassfish.start();\r\n    return this;\r\n  }\r\n\r\n  public EmbeddedRunner stop() throws Exception{\r\n    check();\r\n    glassfish.stop();\r\n    return this;\r\n  }\r\n\r\n  public static void main(String args[]) throws Exception {\r\n    EmbeddedRunner runner = new EmbeddedRunner(8080).init().start();\r\n    Thread.sleep(1000);\r\n    runner.stop();\r\n  }\r\n}\r\n<\/pre>\n<p>The class executes the embedded GlassFish as the beginnings of a <em>containerless<\/em> build, which is a term that James Ward and others have coined. This class starts GlassFish, waits one second, and then shuts it down again. The code works with Gradle, by invoking at the command line gradle run or through an IDE. I used the command gradle idea to generate IDEA project files.<\/p>\n<p>Here is sample output from IntelliJ IDEA 12:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\/Library\/Java\/JavaVirtualMachines\/jdk1.7.0_09.jdk\/Contents\/Home\/bin\/java -Didea.launcher.port=7537 &quot;-Didea.launcher.bin.path=\/Applications\/IntelliJ IDEA 11.app\/bin&quot; -Dfile.encoding=UTF-8 -classpath &quot;\/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&quot; com.intellij.rt.execution.application.AppMain je7hb.common.webcontainer.embedded.glassfish.EmbeddedRunner\r\nclasspath[0] = \/Users\/Developer\/Documents\/IdeaProjects\/javaee7-handbook\/ch06\/servlets-basic\/out\/production\/servlets-basic\r\nclasspath[1] = \/Library\/Java\/JavaVirtualMachines\/jdk1.7.0_09.jdk\/Contents\/Home\/lib\/ant-javafx.jar\r\nclasspath[26] = \/Library\/Java\/JavaVirtualMachines\/jdk1.7.0_09.jdk\/Contents\/Home\/jre\/lib\/ext\/zipfs.jar\r\nclasspath[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.jar\r\nclasspath[28] = \/Users\/Developer\/.gradle\/caches\/artifacts-15\/filestore\/javax\/javaee-api\/7.0-b72\/jar\/56d50eaa8d21c2f70394f607efc1aa27c360141d\/javaee-api-7.0-b72.jar\r\nclasspath[29] = \/Users\/Developer\/.gradle\/caches\/artifacts-15\/filestore\/javax.activation\/activation\/1.1\/jar\/e6cb541461c2834bdea3eb920f1884d1eb508b50\/activation-1.1.jar\r\nclasspath[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.jar\r\nclasspath[31] = \/Applications\/IntelliJ IDEA 11.app\/lib\/idea_rt.jar\r\nFound populator: org.glassfish.kernel.embedded.EmbeddedDomainXml\r\nJan 31, 2013 10:05:12 AM org.glassfish.security.services.impl.authorization.AuthorizationServiceImpl initialize\r\nINFO: Authorization Service has successfully initialized.\r\nJan 31, 2013 10:05:12 AM org.hibernate.validator.internal.util.Version &lt;clinit&gt;\r\nINFO: HV000001: Hibernate Validator 5.0.0.Alpha1\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.config.modularity.StartupConfigBeanOverrider postConstruct\r\nINFO: Starting the config overriding procedure\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.config.modularity.StartupConfigBeanOverrider postConstruct\r\nINFO: Finished the config overriding procedure\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy start\r\nINFO: Grizzly Framework 2.3 started in: 18ms - bound to [\/0.0.0.0:8,080]\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.services.impl.GrizzlyProxy start\r\nINFO: Grizzly Framework 2.3 started in: 3ms - bound to [\/0.0.0.0:8,081]\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot\r\nINFO: Admin Console Adapter: context root: \/admin\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot\r\nINFO: Admin Console Adapter: context root: \/admin\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot\r\nINFO: Admin Console Adapter: context root: \/admin\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.v3.server.AppServerStartup$StartupActivator awaitCompletion\r\nINFO: 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)\r\nJan 31, 2013 10:05:13 AM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run\r\nINFO: JMXStartupService has disabled JMXConnector system\r\nJan 31, 2013 10:05:13 AM com.sun.enterprise.connectors.jms.util.JmsRaUtil getInstalledMqVersion\r\nWARNING: 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.rar\r\nJan 31, 2013 10:05:14 AM org.glassfish.admin.mbeanserver.JMXStartupService shutdown\r\nINFO: JMXStartupService and JMXConnectors have been shut down.\r\nJdbcRuntimeExtension, 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]\r\nJan 31, 2013 10:05:15 AM com.sun.enterprise.v3.server.AppServerStartup stop\r\nINFO: Shutdown procedure finished\r\n\r\nProcess finished with exit code 0\r\n<\/pre>\n<p>You should be seeing something the above output in the IDE if you are doing it right. It would appear we will have to be on our guard until JDK 9 in order to avoid class path loading issues. My book on the user guide to Java EE 7 is scheduled for the Summer of 2013.<\/p>\n<p>Happy Testing.<\/p>\n<p>+PP+<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Very recently, perhaps towards end of last year, the GlassFish open source team released GlassFish 4.0 beta 72 as a promoted build. Arun Gupta posted an article on the Maven coordinates for the GlassFish 4 .0 beta 72 on his blog. This release was significant because the team published the artifacts into a maven repository. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[157,158,159,110,143,40],"tags":[],"_links":{"self":[{"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/posts\/980"}],"collection":[{"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=980"}],"version-history":[{"count":15,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/posts\/980\/revisions"}],"predecessor-version":[{"id":1003,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/posts\/980\/revisions\/1003"}],"wp:attachment":[{"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xenonique.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}