In the previous post, I was able to set up an EC2 instance in AWS that mimics the Elastic Beanstalk setup.
The next step is deploying the Grails app into this instance.
I did the WAR deployment into Tomcat route, which involves:
- Bundling the app into a WAR file via
grails prod war
. - Uploading the WAR into the EC2 instance.
- Copying the WAR file into
/usr/share/tomcat8/webapps
and renaming it to ROOT.war - Restarting Tomcat.
As expected, Tomcat expanded the WAR file into ROOT folder. However when I access the Grails URL, I received a 404 error, with the following details:
The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
I was perplexed, I couldn’t really work out what I did wrong and the error message was cryptic to me. Luckily, I found this: Grails war on Tomcat 7 results in 404.
Java version matters
From the GitHub issue above, it turns out: the Java version used to create the WAR and Tomcat server’s Java version matters.
I compiled my WAR on my laptop which has Java 8. However I uploaded it to EC2 with Java 7.
When I updated the Java version on the EC2 server, the problem is solved! Yay.
To update the Java version on EC2 (Linux based of course):
sudo yum install java-1.8.0
sudo yum remove java-1.7.0-openjdk
Happy hacking!