Saturday, October 23, 2010

Failed trying to bake Spring into Vaadin + GAE + JDO

I'm doing web application development using Vaadin, Google App Engine, JDO / DataNucleus, and... Spring Framework.

Spring Framework actually works fine, except for the JDO part. And I'm not touching transaction management yet!

When getting PersistenceManagerFactory programmatically, the app works great.

public class PMF {

private static final PersistenceManagerFactory pmfInstance = JDOHelper
.getPersistenceManagerFactory("transactions-optional");

private PMF() {
}

public static PersistenceManagerFactory get() {
return pmfInstance;
}
}

Usage:

home.addComponent(new Button("View", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Collection<Organization> orgs = (Collection<Organization>) pm.newQuery(Organization.class).execute();
mainWindow.showNotification("You have " + orgs.size());
} finally {
pm.close();
}
}
}));

However, when using Spring Framework, it... sort of... doesn't work. I'll explain the "sort of" part later.

Here's part of my applicationContext.xml :

<bean id="persistenceManagerFactory"
class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
<property name="persistenceManagerFactoryName" value="transactions-optional" />
</bean>

And using it:

@Autowired
private PersistenceManagerFactory pmf;
...
home.addComponent(new Button("View", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
PersistenceManager pm = pmf.getPersistenceManager();
try {
Collection<Organization> orgs = (Collection<Organization>) pm.newQuery(Organization.class).execute();
mainWindow.showNotification("You have " + orgs.size());
} finally {
pm.close();
}
}
}));

It's a simple change.

The app loads, and doing database operations on the Vaadin Application.init() works fine. However, trying to do database operations on a button click handler for example, throws the following exception:

com.vaadin.event.ListenerMethod$MethodException
Cause: javax.jdo.JDOFatalUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o
NestedThrowables:
org.datanucleus.exceptions.NucleusUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:507)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1154)
at com.vaadin.ui.Button.fireClick(Button.java:371)
at com.vaadin.ui.Button.changeVariables(Button.java:193)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1094)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:590)
at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:266)
at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:476)
at com.vaadin.terminal.gwt.server.GAEApplicationServlet.service(GAEApplicationServlet.java:242)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: javax.jdo.JDOFatalUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o
NestedThrowables:
org.datanucleus.exceptions.NucleusUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o
at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:354)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:544)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManager(JDOPersistenceManagerFactory.java:576)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.getPersistenceManager(JDOPersistenceManagerFactory.java:557)
at com.abispulsa.bisnis.mobile.VaadinApp$1.buttonClick(VaadinApp.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:487)
... 35 more
Caused by: org.datanucleus.exceptions.NucleusUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o
at org.datanucleus.store.FederationManager.initialiseStoreManager(FederationManager.java:197)
at org.datanucleus.store.FederationManager.<init>(FederationManager.java:70)
at org.datanucleus.ObjectManagerFactoryImpl.initialiseStoreManager(ObjectManagerFactoryImpl.java:153)
at org.datanucleus.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:526)
... 44 more

I'm really not sure what I did wrong... I also tried the alternative way of getting PersistenceManagerFactory per GAE's guide:

<bean id="persistenceManagerFactory" class="javax.jdo.JDOHelper" factory-method="getPersistenceManagerFactory">
<constructor-arg value="transactions-optional" />
</bean>

Result is exactly the same. I tried adding PersistenceManagerFactoryProxy and still the same error.

I tried adding a TransactionManager :

<bean id="persistenceManagerFactory"
class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean" autowire-candidate="false">
<property name="persistenceManagerFactoryName" value="transactions-optional" />
</bean>

<bean id="persistenceManagerFactoryProxy"
class="org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy">
<property name="targetPersistenceManagerFactory" ref="persistenceManagerFactory" />
<property name="allowCreate" value="true" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jdo.JdoTransactionManager">
<property name="persistenceManagerFactory" ref="persistenceManagerFactory" />
</bean>

still doesn't work.

I tried making the Spring PersistenceManagerFactoryProxy scope="session" and I get an exception saying it is not serializable (a common problem in Google App Engine development):

Oct 23, 2010 5:48:45 PM com.vaadin.terminal.gwt.server.GAEApplicationServlet service
SEVERE: NotSerializableException: java.io.NotSerializableException: org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy$PersistenceManagerFactoryInvocationHandler
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.HashMap.writeObject(HashMap.java:1000)
at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at com.vaadin.terminal.gwt.server.GAEApplicationServlet.service(GAEApplicationServlet.java:248)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Right now I'm stuck with Spring Framework and JDO.

There are several alternatives for me now:
  1. Leave JDO alone, use Spring for other parts of application
  2. Try another dependency injection framework, like Guice or Weld/CDI
  3. Keep banging my head...? :P

Friday, October 22, 2010

Session Expired error in Vaadin and Google App Engine

When developing a Vaadin RIA web application on Google App Engine and you get the following error when clicking a button or any UI action:

Session Expired
 
Take note of any unsaved data, and click here to continue.

90% of the time it means your program throws an Exception.

So check the Console for exceptions and fix it.

Configuring Vaadin, GAE, and DataNucleus JDO using Vaadin Eclipse Plugin and Google Eclipse Plugin

The following combination:
  • Vaadin 6.4.6
  • GAE SDK 1.3.8
  • DataNucleus JDO 1.1.5 for Google App Engine (adapter version: 1.0.7)
  • Vaadin Eclipse Plugin 1.2.1
  • Google Plugin for Eclipse 1.3.3
  • Eclipse Helios 3.6SR1
When building a Google App Engine project and your encounter the following error message:

Encountered a problem: Unexpected exception
Please see the logs [/tmp/enhance7599385286098074928.log] for further information.

that log file contains:

java.lang.RuntimeException: Unexpected exception
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:59)
at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.java:60)
at com.google.appengine.tools.enhancer.Enhance.main(Enhance.java:41)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:57)
... 2 more
Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/home/ceefour/Vendor/appengine-java-sdk-1.3.8/lib/user/orm/datanucleus-appengine-1.0.7.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/home/ceefour/project/AbisPulsa/abispulsabisnis/war/WEB-INF/lib/datanucleus-appengine-1.0.7.final.jar."
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:434)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerBundle(NonManagedPluginRegistry.java:340)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensions(NonManagedPluginRegistry.java:222)
at org.datanucleus.plugin.NonManagedPluginRegistry.registerExtensionPoints(NonManagedPluginRegistry.java:153)
at org.datanucleus.plugin.PluginManager.registerExtensionPoints(PluginManager.java:82)
at org.datanucleus.OMFContext.<init>(OMFContext.java:160)
at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:172)
at org.datanucleus.enhancer.DataNucleusEnhancer.<init>(DataNucleusEnhancer.java:150)
at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1157)
... 7 more

* * * * * * * *

The Solution to this problem:
  1. Go to Project > Properties > Java Build Path
  2. Remove Web App Libraries
  3. Click Add JARs... , and add your Vaadin JAR from your project's war/WEB-INF/lib

* * * * * * * *

The reason is because Google Plugin for Eclipse copies DataNucleus libraries to war/WEB-INF/lib (which is "Web App Libraries") and itself (the Google App Engine SDK) already contains DataNucleus libraries.

The problem is in how GAE plugin interacts with the standard Eclipse Web Tools Platform (WTP). The Google plugin is designed to work primarily with its own non-WTP projects, and apparently does not handle WTP projects correctly. There is minimal documentation for using the Google plugin in existing projects (such as WTP), but it does not address this issue.

In summary, considering this a Google plugin WTP incompatibility, not a Vaadin plugin specific problem.

For more info see:

Saturday, October 16, 2010

Vaadin application not refreshing in Eclipse internal browser - and how to fix it

Yesterday I was frustrated because at some point, after making a change in my Vaadin-Scala RIA web application, the application won't refresh at all!

I tried:

  • refreshing the browser (tens of times!)
  • appending a query string at the end of URL
  • republishing the app (whether automatically, incrementally, Full Republish)
  • restarting the server
  • running the server in Debug mode... nothing works!

Nothing works.

I almost suspected it's because of Scala, because Scala IDE Plugin for Eclipse 3.6 Helios is still not in final version. I could have just used Java but...

There's no compilation error whatsoever. I didn't even use Maven (yet). So what could go wrong?

Then I opened the application using Google Chrome and it shows the latest version of my application!

It turns out that something is wrong with Eclipse XUL Browser (internal browser) and caching.

So the fix/workaround turned out to be very simple: don't use Eclipse XUL Browser (internal browser)... use a real external browser (Firefox, Google Chrome, Opera, whatever as long as it's not internal browser)!

Friday, October 15, 2010

Mixing Scala and Java in a JSF 2.0 / Java EE 6 project

You can use Scala programming language in a JSF 2.0 / Java EE 6 web application just fine.
And it works very well!

For starters, this is what you need:


Steps to create a mixed Scala-Java JSF 2.0 web project:
  1. Install Eclipse IDE Java EE with the above plugins
  2. Create a new Dynamic Web Project - JSF 2.0 like usual
  3. After project creation, change the perspective to Scala
  4. Right click the Project, click Configuration -> click Add Scala nature
  5. Make sure Scala Library is on the Java Build Path
  6. Make sure Scala Library is on the Web Deployment Assembly
  7. Start to code a Scala bean or class and use them just like Java classes! *with pleasure* :D

Troubleshooting


If Scala classes don't work, and you encounter these error messages:

WARNING: WEB9052: Unable to load class places.City, reason: java.lang.NoClassDefFoundError: scala/ScalaObject
INFO: Initializing Mojarra 2.0.2 (FCS b10) for context '/scalajsf'
SEVERE: Unable to load annotated class: places.City, reason: java.lang.NoClassDefFoundError: scala/ScalaObject

Then you need to add Scala library to the web deployment assembly.

  1. Right-click your Project, and click Properties...
  2. Click Deployment Assembly
  3. Click Add..., then choose Scala Library. The dialog should look like the picture below.
  4. Click OK to close the dialog.
  5. Rebuild & republish the web project and your Scala JSF 2.0 web project should run fine.

Wednesday, October 13, 2010

Fixing org.apache.jasper.JasperException: PWC6180: Unable to initialize TldScanner Error on GlassFish 3.0.1

If you get the following error when running a Java EE 6 / JSF 2.0 web application in GlassFish 3.0.1 :

Oct 14, 2010 1:05:26 AM org.apache.catalina.core.StandardContext callServletContainerInitializers
SEVERE: PWC1420: Error invoking ServletContainerInitializer org.apache.jasper.runtime.TldScanner
org.apache.jasper.JasperException: PWC6180: Unable to initialize TldScanner
at org.apache.jasper.runtime.TldScanner.scanTlds(TldScanner.java:287)
at org.apache.jasper.runtime.TldScanner.onStartup(TldScanner.java:228)
at org.apache.catalina.core.StandardContext.callServletContainerInitializers(StandardContext.java:5352)
at com.sun.enterprise.web.WebModule.callServletContainerInitializers(WebModule.java:550)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5263)
at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619)
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:214)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:144)
at org.glassfish.maven.RunMojo.execute(RunMojo.java:98)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:195)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:140)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:314)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:151)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:445)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:168)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: java.lang.IllegalArgumentException: javax.servlet.ServletException: com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class com.sun.appserv.web.taglibs.cache.CacheContextListener
at org.apache.catalina.core.StandardContext.addListener(StandardContext.java:2659)
at org.apache.catalina.core.StandardContext.addListener(StandardContext.java:2642)
at org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1270)
at org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:665)
at org.apache.jasper.runtime.TldScanner.addListener(TldScanner.java:435)
at org.apache.jasper.runtime.TldScanner.scanJar(TldScanner.java:420)
at org.apache.jasper.runtime.TldScanner.scanJars(TldScanner.java:633)
at org.apache.jasper.runtime.TldScanner.scanTlds(TldScanner.java:282)
... 39 more

The solution is to update the jsp-impl.jar library file since GlassFish 3.0.1 used an older and buggy one.

Download the newest jsp-impl.jar from http://download.java.net/maven/2/org/glassfish/web/jsp-impl/
(currently the newest version is 2.2.2-b03)

Overwrite the file in ${GLASSFISH_HOME}/glassfish/modules/jsp-impl.jar with the new jsp-impl.jar (rename the file to omit the version number).

Now your Java EE applications should run just fine. I also run a mixed Java EE/Scala web application and it runs fine with the new jsp-impl.jar.

Sunday, October 10, 2010

Using Scala with Java EE 6 / JSF 2.0 / JPA 2.0

These articles will help you integrate beans/classes written in Scala programming language with Java EE 6 technologies (i.e. JSF 2.0, JPA 2.0, EJB 3.1):

Scala, JSF 2, and NetBeans Posted by cayhorstmann on September 4, 2010 at 1:08 AM PDT

JSF 2.0, Session Beans and JPA using Scala

May 5, 2010 Java EE 6 and Scala February 22nd, 2010 by Zach Cox
Why @LocalBean is required for Scala and EJB

Some use NetBeans, some use Eclipse IDE. All of them use Maven to enable mixed Java/Scala project.