Eclipse WTP + Gradle Buildship not deploying all project dependencies

Config: Eclipse Neon.1. BuildShip plugin 1.0.21. Gradle 3.2. Tomcat 8.0.33.

Project Structure:

  • CmbProduct
    • Common
    • CommonServer
    • Model
    • CaBridge
    • WebApp

I’ve got a Web Services application project (“WebApp”) which is dependent on multiple other projects. When I use Eclipse WST/WTP to deploy and run WebApp via Tomcat, only Model.jar from “Model” is deployed into the tomcat WST runtime directory as:

.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapp/WEB-INF/lib/Model.jar

All other dependencies for hibernate, etc do seem to be deployed correctly to the same dir above.

This broke when I changed eclipse to use Buildship. Previously I used the Eclipse STS (Spring) plugin and that worked fine.

Here is the web project (WebApp) build.gradle:

apply plugin: 'war'
apply plugin: 'eclipse-wtp'

dependencies {
	compile project(":Common")
	compile project(":Model")
	compile project(":CommonServer")
	compile project(":CaBridge")
	...
}

eclipse {
	wtp {
		component {
      		// Configure the <Context path="..."/> in server.xml
      		contextPath = '/console'

      		// dependencies to mark as deployable with lib folder deploy path
      		libConfigurations += [ project(":MagniCompCommon").configurations.runtime ]
		}
	}
}

In the above example I first tried without the eclipse.wtp.libConfigurations section. I tried adding that to fix the problem but it has no effect. Yes, I did run ‘gradle eclipseWtp’, then Add/Remove the ‘WebApp’ application from its server entry after making that change.

If I go to Eclipse → WebApp → Properties → Java Build Path → Libraries and look at “Web App Libraries” I see “Model” but not the other projects. If I look at “Project and External Dependencies” I see all projects listed.

Here is the build.gradle for Model (working):

apply plugin: 'eclipse-wtp'

dependencies {
	compile project(":MagniCompCommon")
}

Here is build.gradle for Common (not deployed):

apply plugin: 'eclipse-wtp'

dependencies {
	//compile project(":MagniCompCommon")
	compile project(":Model")
	
	compile("org.glassfish.jersey.containers:jersey-container-servlet:$jerseyGlassfishVersion")
	// Required for JAX-RS Client
	compile("org.glassfish.jersey.core:jersey-client:$jerseyGlassfishVersion")
}

Here is build.gradle for the top level project (CmbProject):

apply plugin: 'java'

subprojects {

	apply plugin: 'java'
	apply plugin: 'nebula.provided-base'
	apply plugin: 'nebula.optional-base'

	sourceCompatibility = JavaVersion.VERSION_1_8
	javadoc.enabled = false

	sourceSets {
		main {
			java {
				// Define all source dirs - Purpose is to add "src-gen"
				srcDirs = ["src/main/java", "src-gen"]
			}
		}
	}

	/*
	 * Repositories used by each subproject must be given below.
	 * Because each subproject resolves dependencies of other
	 * subprojects, all subprojects must know all repos.
	 * In other words, if projectA needs repo "foo.org" and projectB
	 * depends upon projectA, then projectB needs repo "foo.org" as
	 * well.
	 */
	repositories {
		maven {
			// Local repo for annovention
			url uri("$rootDir/MagniCompCommon/repo")
		}

		mavenCentral()
		maven {
			url "http://download.java.net/maven/2"
		}
		maven {
			// Texo/EMF
			url "https://oss.sonatype.org/content/groups/public/org/eclipse/emf"
		}
		maven {
			// Eclipse
			url "https://oss.sonatype.org/content/repositories/public/eclipse"
		}
		maven {
			url "https://repository.jboss.org/nexus/content/groups/public-jboss"
		}
		maven {
			url "http://maven.vaadin.com/vaadin-addons"
		}
		maven {
			url "http://oss.sonatype.org/content/repositories/vaadin-snapshots"
		}
		maven {
			url("http://maven.clapper.org")
		}
		/*
		 * -ADD LAST- so that it doesn' override any others
		 * DynamicReports depends upon JasperReports which lists their own
		 * bug fixed versions of packages like "com.lowagie:itext:2.1.7.js2"
		 * This repo provides such patched packages.
		 */
		maven {
			url("http://jasperreports.sourceforge.net/maven2")
		}
	}

	/*
	 * Variables local to this file
	 */
	def bouncycastleVersion = "1.54" // Was 1.51
	def slf4jVersion = "1.7.19"
	def hibernateVersion = "4.3.11.Final"
	def texoVersion = "0.9.0-v201501182340"
	def emfVersion = "2.11.0-v20150123-0347"
	def jnaVersion = "4.1.0"

	ext {
		/*
		 * Variables here are used by subprojects
		 */
		vaadinVersion = "7.6.8" // was 7.6.4
		vaadinIconsVersion = "1.0.1"
		jerseyGlassfishVersion = "2.23.2" // was 2.22.2
	}

	dependencies {

		/*
		 * PRODUCT SPECIFIC
		 */
		compile("org.bouncycastle:bcprov-jdk15on:$bouncycastleVersion")
		compile("org.bouncycastle:bcprov-ext-jdk15on:$bouncycastleVersion")
		compile("org.bouncycastle:bcpkix-jdk15on:$bouncycastleVersion")

		compile("com.h2database:h2:1.3.176")

		testCompile("org.testng:testng:6.9.4")

		/*
		 * MagniComp common and product
		 */
		compile("org.simpleframework:simple-xml:2.6.9")
		// Logging slf4j API
		compile("org.slf4j:slf4j-api:$slf4jVersion")
		// Send JCL to slf4j
		compile("org.slf4j:jcl-over-slf4j:$slf4jVersion")
		// Anything using JUL should defer to slf4j
		compile("org.slf4j:jul-to-slf4j:$slf4jVersion")
		// Send slf4j to log4j 1.2 for those JARs which use slf4j
		compile("org.slf4j:slf4j-log4j12:$slf4jVersion")
		// Log4j itself
		compile("log4j:log4j:1.2.17")
		// Hibernate
		// Do not include "hibernate-core" explicitly as hibernate-entitymanager will take care of it
		compile("org.hibernate:hibernate-entitymanager:$hibernateVersion")
		compile("org.hibernate:hibernate-c3p0:$hibernateVersion")

		compile("mysql:mysql-connector-java:5.1.38")

		// Texo
		compile("org.eclipse.emf:org.eclipse.emf.texo:$texoVersion")
		compile("org.eclipse.emf:org.eclipse.emf.texo.server:$texoVersion")
		compile("org.eclipse.emf:org.eclipse.emf.texo.xml:$texoVersion")
		// Texo dependencies (not automaticly added by texo)
		compile("org.eclipse.emf:org.eclipse.emf.common:$emfVersion")
		compile("org.eclipse.emf:org.eclipse.emf.ecore:$emfVersion")
		compile("org.eclipse.emf:org.eclipse.emf.ecore.xmi:$emfVersion")
		// Required by org.eclipse.emf
		// Disable because it's causing: 
		//   java.lang.SecurityException: class "org.osgi.framework.BundleReference"'s signer information does not match signer information of other classes in the same package
		//compile("org.eclipse.core:org.eclipse.core.runtime:3.7.0")

		compile("org.jsoup:jsoup:1.7.2")

		// Apache HTTP client
		compile("org.apache.httpcomponents:httpclient:4.3.5")
		// EventBus and more
		compile("com.google.guava:guava:18.0")

		// Quartz scheduler
		compile("org.quartz-scheduler:quartz:2.2.2") {
			exclude group: "c3p0", module: "c3p0"
		}
		// Java Mail
		compile("javax.mail:mail:1.4.5")

		// JNA for Common and CaBridge
		compile("net.java.dev.jna:jna:$jnaVersion")
		compile("net.java.dev.jna:jna-platform:$jnaVersion")

		// This package provided by Tomcat or Servlet container
		provided("javax.servlet:javax.servlet-api:3.1.0")

	}
}

Can you please provide a reproducible example on GitHub?

I was able to create a standalone test project and put it on github:

In this project the “License” project is a dependency of “WebApp” but “License” is not displayed under WebApp -> Web App Libraries and when I undeploy/deploy WebApp using Eclipse WST it is not placed in the tmp0/WEB-INF/lib directory either.

In the above example the file metadata.tar.gz is a gzip tar of the full eclipse .metadata directory.

Hi,

I did an investigation on your problem. Here are my comments:

In the above example I first tried without the eclipse.wtp.libConfigurations section. I tried adding that to fix the problem but it has no effect

The libConfigurations configure server deployment for binary dependencies only.

I did run ‘gradle eclipseWtp’, then Add/Remove the ‘WebApp’

You don’t have to bother with that. Buildship 1.0.21 configures the WTP deployment paths and calls eclipseWtp upon project synchronisation. You can see the latter happening in the console (look for the Gradle Model Retrievals console).

I was able to create a standalone test project and put it on github:

I checked out your example. It seems that the License project is not marked as a web project. Just apply the eclipse-wtp on it, start the project synchronization (right click > Gradle > Refresh Gradle Projects) and your project will appear amongst the web modules:

I added “apply plugin: ‘eclipse-wtp’” to the License project and did a refresh. That fixed the problem! I then did the same thing to my actual product workspace and it also fixed the problem. Thank you!

Bottom line: All projects which are dependencies of a WTP project must each have the ‘eclipse-wtp’ plugin.

Many thanks for the help!!!