Pilven reunalle istumaan JEE serverin kera

Tänään koulutellessa Java EE ohjelmointia tuli vastaan kysymys siitä, mitkä suomalaiset web-hotellit tukevat Java EE softan asennusta ja ajamista. Itselle on tutuksi tulleet lähinnä Google App Engine sekä Amazon pilvipalvelut entuudestaan, mutta suomalaista tarjontaa en juuri tuntenut joten ei kun tutustumaan.

Tarjokkaita löytyi lopulta – pun intended – pilvin pimein. Mutta jostakin syystä käteen jäi itselle Jelastic, pystytin sinne trial hengessä pienen glassfish serverin, mysql kannan, ja noin 10 minuutin uurastuksella perinteiseen tapaan vältellen ohjeiden lukemista pystyssä oli hetken päästä toimiva ympäristö kurssin harjoituksille. Itse harjoitustehtävälle en tehnyt mitään muutoksia, tuuppasin paketoidun JPA:ta ja servlettejä sisältävän .war paketin suoraan Jelastic pilveen, mutta etukäteisvalmisteluna loin toki mysql kantaan uuden scheman, sille sopivat käyttäjätunnarit, kirjauduin glassfish hallintakonsoliin, loin mysql connection poolin, ja sen päälle datasourcen nimeltä jdbc/sample – jota harjoitustehtävä käytti.

Forum war paketti tuupattuna serverille

Yllättävän kivuton ja hauska prosessi. Toki trial serverillä serverien resurssit on kuristettu niin alas että sain sähköpostiin motkotuksia vähistä resursseista ja serverin kriittisestä tilasta. Mutta nehän korjautuvat rahalla, pilven idean mukaan sellaisen viipaleen saa mistä maksaa – ja mitä käytetään.

mysql_admin

 

glassfish_admin

Hauskaa oli havaita, että jopa serverin tiedostoihin pääsi vapaasti käsiksi. Serverin lib kansioon piti tietysti ladata mysql connector/j ajuri.

Näyttää että pilvet alkavat suomessakin olemaan elinvoimaisia. Odotellessa kummoisempia pilvistandardeja Java-maailmaan Java EE tekniikat toimivat jo hyvin ja sovellukset siirtyvät paikalliselta testipalvelimelta pilveen – toki oma oppimiskäyränsä on resursoinnissa ja hallinnassa, sekä vasteaikojen hiomisessa, mutta lupaavaa kumminkin. Taitaa olla takana ajat kun itsekin linux purnuja webin nurkalle pystyttelin oman huoneen nurkkaan :p

accesstoserverfilesandfolders

 

Tervetuloa vain mukaan pilven reunalle istuksimaan! 😉

 

Google App Engine pilvipalvelu ja Java EE 6, osa 3

No niin, huomasin etten ole mennyt paljonkaan yksityiskohtiin näissä pilvipalveluissa, eli ihan omaksi muistintueksikin, tässä yksityiskohtia. Varoitus, tästä tulee rumaa, kuten aina kun yksityiskohtiin mennään.

Toimiva Maven pom jossa on mukana JPA 1 ja JSF 2, on tässä:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>fi.tieturi</groupId>
  <artifactId>PilvenVeikko</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>PilvenVeikko Java EE 6 Webapp</name>
  <url>http://maven.apache.org</url>
  <repositories>
    <repository>
      <id>java.net2</id>
      <name>Repository hosting the jee6 artifacts</name>
      <url>http://download.java.net/maven/2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>maven-gae-plugin-repo</id>
      <name>maven-gae-plugin repository</name>
      <url>http://maven-gae-plugin.googlecode.com/svn/repository</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.0.2</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>el-impl</artifactId>
      <version>2.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-jpa</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-core</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>javax.jdo</groupId>
      <artifactId>jdo2-api</artifactId>
      <version>2.3-eb</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-enhancer</artifactId>
      <version>1.1.4</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-rdbms</artifactId>
      <version>1.1.5</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.google</groupId>
      <artifactId>appengine-local-runtime-shared</artifactId>
      <version>1.2.0</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-appengine</artifactId>
      <version>1.0.7.final</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.google</groupId>
      <artifactId>appengine-sdk-api</artifactId>
      <version>1.3.8</version>
      <type>jar</type>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
           <source>1.6</source>
          <target>1.6</target>
       </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1-beta-1</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
    </plugin>
    <plugin>
        <groupId>net.kindleit</groupId>
        <artifactId>maven-gae-plugin</artifactId>
        <version>0.6.0</version>
       <configuration>
          <sdkDir>D:/java/appengine-java-sdk-1.3.8</sdkDir>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.datanucleus</groupId>
        <artifactId>maven-datanucleus-plugin</artifactId>
        <version>1.1.4</version>
        <configuration>
          <mappingincludes>**/domain/*.class</mappingincludes>
          <verbose>true</verbose>
          <enhancername>ASM</enhancername>
          <api>JPA</api>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>enhance</goal>
            </goals>
          </execution>
      </executions>
      <dependencies>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-core</artifactId>
          <version>1.1.5</version>
          <exclusions>
           <exclusion>
              <groupId>javax.transaction</groupId>
              <artifactId>transaction-api</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-rdbms</artifactId>
          <version>1.1.5</version>
        </dependency>
        <dependency>
          <groupId>org.datanucleus</groupId>
          <artifactId>datanucleus-enhancer</artifactId>
          <version>1.1.4</version>
        </dependency>
      </dependencies>
      </plugin>
    </plugins>
    <finalName>PilvenVeikko</finalName>
  </build>
  <profiles>
    <profile>
      <id>netbeans-private</id>
      <activation>
        <property>
          <name>netbeans.execution</name>
          <value>true</value>
        </property>
      </activation>
      <properties>
        <netbeans.deployment.server.id>[C:\Program Files (x86)\glassfish-3.0.1\glassfish]deployer:gfv3ee6:localhost:4848</netbeans.deployment.server.id>
      </properties>
    </profile>
  </profiles>
  <properties>
    <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
  </properties>
</project>

Julkaisin tuon kokonaisena copy-pastea ajatellen. Pieni mutta tärkeä kohta on lopussa oleva DataNucleus enhancer plugin, koska DataNucleus käyttää vielä vanhanaikaista bytecode vahvistusta, tuo vaihe tehdään käännöksen jälkeen, tärkeää tarkistaa että pakettirakenne-parametri on oikein. Vierastan lisä ant scriptien käyttöä joten yritin tehdä kaiken Mavenillä ja näyttäisi toimivan.

Toinen jippo oli imaista gae kirjastot paikalliseen maven repositoryyn etukäteen, koska tietääkseni niitä ei globaaleista repositoryistä löydy. Kirjastot mitä näemmä tarvittiin olivat datanucleus-jpa, datanucleus-core, jdo2-api, datanucleus-enhancer, datanucleus-rdbms, appengine-local-runtime-shared, datanucleus-appengine, sekä appengine-sdk-api. Lisäksi javan core kirjastoista tarvitsin persistence-api ja servlet-api ja jsp-api pakettien lisäksi jsf-api ja jsf-impl kirjastot, versio 2, sekä el-impl. Huom! JSF-impl on google app enginelle tuunattu versio, johtuen parista rajoituksesta sen suhteen. Tässä pari linkkiä siihen:

Take a look at this site
http://javadocs.wordpress.com/2009/10/17/mojarra-jsf-2-0-rc2-and-google-app-engine-sdk-1-2-6/

and download this file
http://code.google.com/p/joshjcarrier/source/browse/trunk/Sun%20JSF%20GAE/jsf-impl-gae.jar

Rakensin tällaisen scriptin joka vie ne repositoryyn:

call mvn install:install-file -Dfile=lib/appengine-tools-api.jar -DgroupId=com.google -DartifactId=appengine-tools -Dversion=1.2.0 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/shared/appengine-local-runtime-shared.jar -DgroupId=com.google -DartifactId=appengine-local-runtime-shared -Dversion=1.2.0 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/appengine-api-1.0-sdk-1.3.8.jar -DgroupId=com.google -DartifactId=appengine-sdk-api -Dversion=1.3.8 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-appengine-1.0.7.final.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-appengine -Dversion=1.0.7.final -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-core-1.1.5.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-core -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/datanucleus-jpa-1.1.5.jar -DgroupId=org.datanucleus -DartifactId=datanucleus-jpa -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/jdo2-api-2.3-eb.jar -DgroupId=org.datanucleus -DartifactId=jdo2-api -Dversion=2.3 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/geronimo-jpa_3.0_spec-1.1.1.jar -DgroupId=org.geronimo -DartifactId=geronimo.jpa -Dversion=1.1.1 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=lib/user/orm/geronimo-jta_1.1_spec-1.1.1.jar -DgroupId=org.geronimo -DartifactId=geronimo.jpa -Dversion=1.1.5 -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -Dfile=jsf-impl-gae.jar -DgroupId=com.sun.faces -DartifactId=jsf-impl -Dversion=2.0.2 -Dpackaging=jar -DgeneratePom=true

No niin , ehkäpä siinä oli taas tarpeettoman paljon tietoa tällä kertaa 😉 Joka tapauksessa, itselleni muistiin mitä askelia tarvittiin pilveen pääsemiseen.

Google App Engine pilvipalvelu ja Java EE 6, osa 1

Olen aivan pilvessä.

No niin, vaikka Pilvi on uusi trendi, tuo on jo vitsinä vanha. Joka tapauksessa, tänään oli hetkonen aikaa kokeilla Google App Engine viritystä vähäsen, olen jo aiemmin sinne tehnyt palveluita mutta nyt ehti hetken kokeilla ajatuksella.

Google App Engine ideana on hostata ympäristö josta voi ostaa skaalautuvasti prosessointitehoa ja muistia ja levytilaa, niinsanotusti vääntöä. Palvelusta löytyy myös tietokantaratkaisuja, ja tukea löytyy useammalle ohjelmointikielelle. Liikkeellelähtö on ilmaista, mutta jos kapasiteetin tarpeet kasvavat, skaalautuvuutta saa rahalla.

Minua tietysti kiinnosti miten uudet Java EE 6 solakat ohjelmointitekniikat siellä pelaavat, ja pelasivathan ne, pienin virityksin. Sain iltapäivän aikana Maven vetoisen projektin nykäistyä kasaan, sinne tuki EE 6 piirteille kuten JSF 2, ja tietysti Netbeans editorina. Mitään kovin ihmeellistä en ole vielä koonnut palveluun mutta tämä on silti hyvä alku. Tuli peräti lämmin tunne kun omin silmin näki miten jsf softa jota hetki sitten oli ajanut omalla koneellaan pyöri nyt hostattuna Googlen myllytyksessä. Ja niillä pojilla muuten myllyä piisaa.

Tämä oli alku, ja jatkossa aion kytkeä CDI mekanismit päälle, tutkia miten JPA 2 alustalla pelaa, ja tehdä sinne jonkun sovelluksen. Tällä hetkellä kallistuisin työajanseurannan puoleen, ne ovat aina hätäisesti tehtyjä virityksiä ja tässä olisi tilaisuus tehdä helposti skaalattava softa suht vähällä vaivalla ja pistää pilvi koetukselle. Katsotaan miten käy. Jatko-osia siis tulossa jahka löydän lisää aikaa.