Recent events have thrust me back into the world of GWT
Development. So much has changed. RequestFactories, EventBuses, all sorts of
improvements. I haven’t had to dig this deep in a while. But these are great
improvements, and they take GWT that extra mile.
The source of my recent aggravations hasn’t been with GWT.
It has been with Maven. Maven is a wonderful build tool. There is something
really nice about being able to say “Hey, Maven, I want to build this project,
and it has these dependencies”, and having Maven go out and fetch everything,
set up a class path, and build. Awesome. Or at least in theory. One of my
biggest headaches has been building Eclipse Plugins, but that will wait until
another blog post.
This one is about GWT, Eclipse, and Maven. Now my Eclipse
setup is pretty straight forward. I use the BIRT All-In-One 3.7.2 distribution,
with the m2eclipse plugin installed separately (because the BIRT distribution
has an incomplete m2eclipse plugin installed), the GWT Designer and Window
Builder Plugins, and Googles Eclipse GWT Plugin (well, technically GWT Designer
and the GWT Eclipse Plugin are BOTH Googles now….).
“So why so glum, chum?” I ask myself. Well, because things
don’t quite work as advertised out of the box. GWT Designer and the GWT Eclipse
Plugin provide AWESOME support for creating new projects and making things just
work. Maven, no so much. What doesn’t work? Well, besides the thousands of red
‘X’ everywhere in Eclipse, GWT Designer doesn’t work, and the Google Eclipse
Plugin run doesn’t quite work. At least with GWT 2.4, and the 3.7.2 Indigo
setup of Eclipse. So, let me outline how I fixed these annoying issues with a
step by step on creating a new GWT project with Maven and making the necessary
fixes in Eclipse to make things work. I won’t cover getting RequestFactory
working, I’ll leave that for the next post.
4.
On the next screen, for the archetype, enter
“gwt-maven-plugin”. (Note: m2eclipse does something really stupid in my
environment (or maybe all environments in general, I havent investigated it
further) where it will refuse to create more than one project of the same
archtype in my workspace. In order to resolve this, I need to go and completely
delete my .m2 respository, located at /.m2, and let it re-index). If you haven’t indexed your Maven repository
before, it might take a while, so be patient and let it pop up in the grid.
6.
Click Finish.
OK, cool, now we have a GWT project in Eclipse. In fact, you
can run it if you right-mouse click on the project, Run/Maven Build…, and set
the goal to gwt:run.
And it won’t run in Eclipse, which means I can’t debug it. But
it will run just fine in Maven. But I don’t want it to run in Maven, I want it
to run in Eclipse. Why do I want it to run in Eclipse? Because I want to use
all of those really nifty debug capabilities. Otherwise, why bother using GWT,
I could just use some other Javascript framework, like Jquery, or Dojo. So, how
do I get to the point where I can run and debug?
First things last. Lets get rid of all of those ugly errors.
One of the biggest causes of the red ‘X’ is the reliance on the generated
source files that Maven builds for the Internationalization and the Asyncronous
interface. So I need to get these files there. The easiest way is to have Maven
generate the source files for me and copy them over.
This will create the source files under
/target/generated-sources/gwt//. Since most of
these errors are coming from missing client source, I just need to copy them
all over to the /src/main/java//client folder.
Now, I need to tell Maven not to generate these files,
otherwise I will get an error telling me there are duplicate classes. Edit the
POM, and remove the generateAsync and i18n goals. That section should look like
the following when done.
<groupId>org.codehaus.mojogroupId>
<artifactId>gwt-maven-pluginartifactId>
<version>2.4.0version>
<executions>
<execution>
<goals>
<goal>compilegoal>
<goal>testgoal>
goals>
execution>
executions>
But there are still some Red X. Why? The field verifier class is not being found. To fix this, I just went to Project/Clean. Strange, but that fixed it.
So, I still have a red X on my project, but I will ignore
that since this is some Maven specific junk.
So, I want to try to run my project in Eclipse now to see what happens.
So, I want to try to run my project in Eclipse now to see what happens.
This will generate a Launch file. Refresh the project and it
will appear. But there is a problem. If I try to launch it, I will get the
following error.
This will resolve itself if I go to Run Configuration, and
edit the Run configuration for the new project, and go to any of the other tabs. If it doesn't, find the DevMode class from the Search Dialog. But another problem manifests
itself at this point. No modules appear under Available Modules.
You’re killing me… If I try to run this, I just get the help
dialog for the GWT Dev Mode. But this is a simple fix also. All I need to do is
Close this dialog. Right-Mouse click on the project or hit Alt-Enter to bring
up the Projects Property Editor, and go under the Source section. Under the Source
section, select the Excluded item under Sample/src/main/resource, and hit the
Remove button.
And not only did this step fix the problem with the Launch
configuration, it also fixed another issue where files could not be opened with
the GWT Designer Window Builder editor.
I visited a lot of sites researching this issue, and that
last step was nowhere to be found, and was erroneously reported as being some
issue with Eclipse not finding the gwt.xml unless it was in the first source
directory it encounters. This may have been the case in previous version of
Eclipse, but in Indigo this solved my problem.
So there you go. If you followed these steps, you should
have a setup that is as close to the project that Maven generated and still be
able to run in Eclipse so you can use it’s debugging capabilities. This
definitly isn’t as nice as the New Project wizards, but hey, its Mavenized, and
it’s a GWT project. Or at least it’s a GWT-RPC based GWT project, and not a
RequestFactory one. But that’s another story…