Pages

Friday, January 29, 2016

Fun with Oracle DB: ORA-00907

Following SQL select statement leads to an "ORA-00907: missing right parenthesis" warning message:
select * from A a
where a.id in (select b.id from B b order by b.id)
Hm. I don't see anything missing... Ok, let's remove the order clause, as it is not really needed:
select * from A a
where a.id in (select b.id from B b)
And, voilĂ ! No ORA-00907. And it seems that I am not the only one having these troubles, see the blog entry by oraclequirks.

Friday, January 15, 2016

Gradle: From zero to war

Kickstart for creating Java web project with the gradle buildtool.

The well known gradle init task is an easy way to create a Java project:

[520]% gradle init --type java-library

However, there is no support for initializing a web application. Alternatively, you may use the cool gradle-templates of townsfolk: https://github.com/townsfolk/gradle-templates.

How this may be done, is described below.

Step 0: Create master gradle script

Create a master build.gradle script. This may be done anywhere. However, I use the project parent directory where all my projects are found:

buildscript {
    repositories {
        maven {
            url 'http://dl.bintray.com/cjstehno/public'
        }
    }
    dependencies {
        classpath 'gradle-templates:gradle-templates:1.4.1'
    }
}
apply plugin:'templates'

List the tasks:

> gradle tasks
[...]
Template tasks
--------------
createGradlePlugin - Creates a new Gradle Plugin project in a new directory named after your project.
createGroovyClass - Creates a new Groovy class in the current project.
createGroovyProject - Creates a new Gradle Groovy project in a new directory named after your project.
createJavaClass - Creates a new Java class in the current project.
createJavaProject - Creates a new Gradle Java project in a new directory named after your project.
createScalaClass - Creates a new Scala class in the current project.
createScalaObject - Creates a new Scala object in the current project.
createScalaProject - Creates a new Gradle Scala project in a new directory named after your project.
createWebappProject - Creates a new Gradle Webapp project in a new directory named after your project.
exportAllTemplates - Exports all the default template files into the current directory.
exportGroovyTemplates - Exports the default groovy template files into the current directory.
exportJavaTemplates - Exports the default java template files into the current directory.
exportPluginTemplates - Exports the default plugin template files into the current directory.
exportScalaTemplates - Exports the default scala template files into the current directory.
exportWebappTemplates - Exports the default webapp template files into the current directory.
initGradlePlugin - Initializes a new Gradle Plugin project in the current directory.
initGroovyProject - Initializes a new Gradle Groovy project in the current directory.
initJavaProject - Initializes a new Gradle Java project in the current directory.
initScalaProject - Initializes a new Gradle Scala project in the current directory.
initWebappProject - Initializes a new Gradle Webapp project in the current directory.
[...]

As you can see, there are many different templates you may use. For our purpose, the createWebappProject task seems to be interesting.

Step 1: Create the web project

Use the createWebappProject task for creating a new fresh web project. Invoke the task and answer some questions:

> gradle createWebappProject
:createWebappProject

templates> Project Name:  (WAITING FOR INPUT BELOW)
> Building 0% > :createWebappProjecttestweb

templates> Project Parent Directory: [/Development/java/projects/projects-test]  (WAITING FOR INPUT BELOW)
> Building 0% > :createWebappProject

templates> Use Jetty Plugin? (Y|n) [n]  (WAITING FOR INPUT BELOW)
> Building 0% > :createWebappProjectY

templates> Group: [testweb]  (WAITING FOR INPUT BELOW)
> Building 0% > :createWebappProject

templates> Version: [0.1]  (WAITING FOR INPUT BELOW)
> Building 0% > :createWebappProject

BUILD SUCCESSFUL

Total time: 25.877 secs

Check the generated files and directories:

> cd testweb/
> find .
.
./build.gradle
./gradle.properties
./LICENSE.txt
./src
./src/main
./src/main/java
./src/main/resources
./src/main/webapp
./src/main/webapp/WEB-INF
./src/main/webapp/WEB-INF/web.xml
./src/test
./src/test/java
./src/test/resources

List the tasks:

> gradle tasks
Build tasks
-----------
[...]
war - Generates a war archive with all the compiled classes, the web-app content and the libraries.
[...]

Web application tasks
---------------------
jettyRun - Uses your files as and where they are and deploys them to Jetty.
jettyRunWar - Assembles the webapp into a war and deploys it to Jetty.
jettyStop - Stops Jetty.
[...]

Step 2: Create your first page and run it

Create the landing page:

> echo "Hello" > src/main/webapp/index.html

And finally, run the web application in Jetty:

> gradle jettyRun
Starting a new Gradle Daemon for this build (subsequent builds will be faster).
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
> Building 75% > :jettyRun > Running at http://localhost:8080/testweb

Open your browser http://localhost:8080/testweb/ and you should see the welcome message.