views:

1863

answers:

6

I am updating an existing project from GWT 1.5.2 to GWT 2.0.0. We use maven 2 to manage our dependencies and do all of our development in Eclipse 3.5.

Because we use maven to manage our dependencies, I do not have all of those jars in the war\web-inf\lib directory as GWT specifies. Instead, they are in the maven repository, just where maven likes them. I have the project set up so that maven can successfully build and launch in either dev or web mode and the application runs correctly.

The problem is that when I launch from Eclipse, I get a java.lang.NoClassDefFoundError. If I manually copy of my dependencies into war\web-inf\lib before launching, everything runs fine, but that doesn't lend itself to a long-term solution. First, if I check all of those jars into our version control, that will subvert much of the value we get from maven. As annoying as maven can be, ditching it is not the answer. Second, having developers manually copy them over every time they want to debug something is ridiculous.

So can I get Eclipse to copy the dependencies into war\web-inf\lib before launching? Is there an alternate solution that I'm missing?

Thanks,

Tony

A: 

If you have the packaging method in your pom.xml set to war it should copy runtime depdencies into target/war/WEB-INF/lib.

Or is your project to build something larger like an ear? If so you should probably split your pom.xml into multi-project format.

As for Eclipse, I'm not terribly familiar with it so I can't really help you there. Are you (or can you) run a maven target (like "install") when you do a run or debug?

cletus
A: 

You should install the m2eclipse plugin and use that to build your project within eclipse. This will invoke maven as an external tool from within eclipse.

Your maven project artifact type should be set to war, which will let maven discover the dependencies and bundle them.

See these links:

http://stackoverflow.com/questions/97640/force-maven2-to-copy-dependencies-into-target-lib

http://maven.apache.org/plugins/maven-war-plugin/

http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html

crowne
I added the m2eclipse plugin to Eclipse, but that seems to have brought Eclipse to its knees. It now gets stuck "Updating maven Dependencies" upon start up. Once I get a new Eclipse installation up and running, I'll give this a try.
Tony
A local maven repository may alleviate the dependency update issue.I highly recommend that you set up an instance of Nexus http://nexus.sonatype.org/ and set your maven settings to use mirrorOf=* -> your local nexus repo.The initial updates will take some time, but thereafter the rest of your team will be downloading locally cached artifacts, with benefits for you, your team, the public maven repos and the rest of the internet.
crowne
A: 

This is not supposed to be a problem. If you are using Eclipse+WTP then WTP lets you declare jars listed under 'J2EE module dependency' in the project's properties. Those jars are automatically published to tomcat (see note at the end of this comment) You need to declare an M2_REPO variable in your eclipse environment (search eclipse help for 'classpath variables'), it should point to your local maven repository, and just add external jars from there to your project and mark them as 'J2EE dependencies'. I did that with tons of projects, Maven and Eclipse live side-by-side :) (without m2eclipse)

A second option is to try to integrate Eclipse and Maven with m2eclipse plugin, as crowne mentioned, but I found this unnecessary.

There is a third option, if you don't use WTP (but you should). Assuming that you use tomcat, then you can copy those jars to $(tomcat.home)/common/lib. If you can do it just for your private instance of tomcat (on each developer's machine) then you are good to go. This is supposed to be a low-impact solution that will get those jars into the classpath at runtime, but it doesn't scale well.

note: unfortunately the classpath of Eclipse web projects can be confusing. When you add jars to the regular build path of the project, they are not deployed (copied over) to tomcat. To solve this, WTP defines a special library called Webapp Library - this library contains all the jars in the project's WEB-INF/lib folder, as well as all the external jars that are marked as J2EE Module Dependencies. All those jars find their way appropriately to WEB-INF/lib when published to tomcat.

Yoni
+2  A: 

Running the gwt:eclipse goal will copy the maven dependencies into war/WEB-INF/lib. See the Eclipse Configuration section of the Eclipse IDE Integration documentation of the Maven GWT plugin for more details. Also have a look at this answer about Maven GWT 2.0 and Eclipse.

Pascal Thivent
A: 

a maven aware IDE (idea, eclipse, netbeans) should do this packaging automatically. maybe you:

  • forgot to enable maven import inside IDE?
  • did not add these dependencies to the pom.xml (so they aren't included in the 'mvn package' phase)
  • added wrong scope to dependency declaration (e.g. scope 'provided' or 'tested'), so they are ignored for runtime
manuel aldana
A: 

Quite simple: 1. Create a "lib" folder under your project like this: "\src\main\webapp\WEB-INF\lib" 2. Copy needed "jars" etc that you want included inside your WAR bundle folder. 3. Invoke your maven build as you normally do. I use "mvn install", which creates builds the war file.

If you examine the WAR file, your jars that you included in step-1 and step-2 will be there.

Cheers.

Venkatt
This is not helpful. If you read the third paragraph of the question, I explain why step 2 of your answer doesn't work for me.
Tony