Maven project in eclipse - deployment assembly fails build - eclipse

Sorry for being verbose...
I have some existing maven projects. I imported them into Eclipse using Maven -> Import existing Maven projects.
This gave me 6 individual projects and one project which lists all 6 under it. (The umbrella project has 6 modules defined in it which translated to 6 eclipse project - as I understand how maven works)
One of the project A requires two other project B and C (at compile time and run-time).
Build path -
On the build path of A I have one of the libraries as Maven dependencies. And it builds fine.
Deployment assembly -
On the deployment assembly of A however there is no entry for deploy to web-inf/lib. Because of that when tomcat starts it doesn't find any required jars or the project B and C.
So I added an entry to deployment assembly as : source - maven And dependencies deploy - web-inf/lib.
Tomcat comes up and my webapp for project A comes up.
This however breaks the eclipse build - upon build eclipse complains:
"Invalid classpath publish export Project entries not supported"
This I see is because, under build path, there is new entry added to web-inf/lib to publish/export under maven-dependencies. Removing that removes maven entry from the deployment assembly as well.
The only workaround is that in the deployment assembly I specify the web-inf/lib under target generated by maven but that causes stale copies of project B and C to be picked up.
Why I need this setting is because when I make changes to project B and C in Eclipse and build them in Eclipse I want to see the changes when I am debugging project A. I don't want to run maven builds on B and C again since its time consuming.
Any help is much appreciated.
I did try including the MAVEN2_CLASSPATH_CONTAINER but that is always empty and when tomcat runs it cannot find the necessary libraries. (BTW what vale is the MAVEN2_CLASSPATH_CONTATINER set to?)
This is on Eclipse Indigo Mac OSX.

You need to add the relevant project/s to your Deployment Assembly.
Right Click Project -> Properties -> Deployment Assembly -> Add

I solved just doing this:
right click on my eclipse project-> Maven -> Update Project Configuration...

Figured it out ..but not completely...
So I added maven dependency in the deployment assembly as I mentioned earlier.
Maven dependency -> WEB-INF/lib
AND additionally added project B and C as well :
B -> WEB-INF/lib and C->WEB-INF/lib
Somehow this way B and C are not added to the publish/export in the java build path. I don't know how eclipse knows to not export B and C from maven repo but to export it from project B and C itself.
Anyways thats for some other day..
for now i m happy :)

For anyone else that searches for this, it seems that you can also manually add the following to the .classpath file
<classpathentry combineaccessrules="false" kind="src" path="/B"/>

By including Maven Dependencies, you are including dependencies for project B and project C. It turns out, you also have to include project B and C manually.
The exact fix which works is.
project A -> properties -> Deployment Assembly
Click Add and then Project. Select B and C. Problem will get fixed after rebuilding.

I had this problem, but I believe none of these answers correctly fix the problem. Instead they workaround m2eclipse (which should manage classpaths and deployment assembly for you). For me, the problem that I was using m2eclipse without m2eclipse-wtp (a separate plugin).
See this SO answer for the plug-in details.

You can add the relevant projects / or maven java build path entry if using maven to your Deployment assembly (project -> properties -> deployment Assembly)
Then checks if theses relevant project are Facets compatible. (project -> Project Facets)

This error can occur if you have multiple entries of same jar in you class path. So you need to check your classpath and remove duplicate entries.

Related

How do I use a local gradle project as a dependency for another local gradle project in Eclipse?

This worked fine using Maven. Project A would depend on Project B and when I loaded up both Project A and Project B then Project A would use the locally built jar for Project B instead of depending on the jar pulled from Nexus.
All my projects use Gradle now and I can't figure out how to get them to see each other.
If it is just a simple Eclipse Project A depends on Project B, then this simple solution is what worked for me (I had to read for so long to figure this out! Why wasn't it obvious?)
Project B is its own Gradle project and is not necessarily aware of other projects - you don't have to do anything special for Project B
Project A:
settings.gradle
include 'Project B'
project (':Project B').projectDir = new File(settingsDir, "../Project B")
build.gradle
dependencies {
compile project (':Project B')
}
Save the two, and do an Eclipse -> Gradle -> Refresh Dependencies, and you will now see Project B as an actual Project Dependency in the Gradle Dependencies of Project A (I had to use dashes instead of spaces since Eclipse wouldn't let me have spaces in my Gradle projects' names).
Note: if building these projects on a remote server, make sure that you are either checking these two projects into the same source control repository or make sure that they end up in the same place relative to each other the way they are in Eclipse.
Look in the Gradle User Guide, at Chapter 51, "Dependency Management". See if section 51.4.3, "Project dependencies" does what you need.

IvyDE Resolve Dependencies in workspace with a Dynamic Web project in Eclipse

I have a large application with many eclipse (actually using Spring Source Toolsuite) projects with ivy managed dependencies for each project. We currently have it setup and working where you can have project A (a dynamic web project that generates a war) and project B (generates a jar) setup such that project A depends on project B and if you only have project A in your workspace, it will go pull the jar file generated by project B from the ivy repository. We setup the deployment assembly to take the eclipse library generated from the ivy resolve and put it in the WEB-INF/lib directory so we can easily deploy to tomcat.
With the manual process, all of this works. I can make a change to project B, publish it to my local ivy repository, and re-resolve the dependencies on project A, and I get the new project B jar file and everything compiles and updates on tomcat as expected.
The problem I'm having comes when I change the ivy resolve settings of project A to "Resolve dependencies in workspace". When I make changes in project B, project A successfully notices the change and compiles correctly, but the deployment assembly breaks. When I go look in tomcat, it has a folder for project A's context root, but it is empty. If I uncheck the "Resolve dependencies in workspace" checkbox, the context root folder gets populated and everything returns to a working state.
I can continue doing the manual process, but it is a huge timesavings if I can get ivy to use my workspace first, then get the jar from the repository if the project does not exist in my workspace. Any suggestions would be greatly appreciated!
The solution was to add the Utility Module facet to project B (Project Properties->Project Facets->Utility Module) so that eclipse would know the structure of the jar file that is supposed to be generated.

Eclipse can't resolve transitive dependency projects?

In a Java project in Eclipse, I am trying to debug project A.
Project A has a dependency on B.jar, normally B.jar comes from my .m2/repository.
but now I want to make some temp changes to B's code, and have it reflected in A,
so I directly edit the source code in B project in eclipse, and set B as a dependency project in A's build path. Additionally, both A and B refer to C.jar as their dependencies.
This builds A fine, but when it is run, A's classpath contains 2 copies of all the classes and resources in C.jar. this creates a problem for those hibernate hbm.xml mapping files in C.jar and I got errors saying duplicate mapping for...
This looks to be a defect in eclipse, in that it lacks the resolution ability as maven posseses. is there a way to work around this? (apart from building B and installing to .m2 instead of having it as a dependency project)
Thanks
You mentioned "[setting] B as a dependency project in A's build path" - do you mean editing eclipse's build path or editing the project's POM? I'm guessing the former, in which case make sure that you have the latest version of the m2eclipse plugin installed and that both projects A & B are Maven eclipse projects. If it is set up correctly then your projects should look have an 'M' on their project icons, and the icons of any workspace dependencies should look like folders.

Maven build is successful, Eclipse detects cycle in dependencies

I'm working on a large project that consists of many smaller projects (about 140) that are all managed by maven. There is a master pom and a pom for each individual project.
Now I have introduced 2 new small projects, A and B, with the dependency A -> B. Furthermore B depends on another existing project C, so B -> C. A is used by another project D which is (as far as I've seen) independent from C. I'm not sure because the structure is very complex and I don't want to sit there sifting through poms all day.
This means I have a dependency graph like this: D -> A -> B -> C
When I build the master pom in maven (clean install) it finishes successfully. So does the eclipse:eclipse goal that generates the Eclipse project files. When I refresh the projects in Eclipse it rebuilds everything and finishes with the error "A cycle was detected in the build path of project...". This error occurs in about 30 of the 140 projects. Ofcourse Eclipse doesn't tell me what the cycle looks like...
How can it be that maven does not detect a cycle in the dependencies but eclipse does? I thought that the Maven Eclipse plugin just mapped the dependencies from the pom to the Eclipse .project and .classpath files?
The fact that Maven doesn't complain about cycles tells me that there is no dependency C -> D.
I had the same symptoms but with no actual maven cycle. I dealt with this in eclipse Indigo in a workaround fashion: I closed and deleted the eclipse projects that reported this error (not deleting the files making up the project), then re-created the maven projects in eclipse by importing the source files into my workspace with "File->Import...->Maven->Existing Maven Projects". That took care of it.
You may have dependencies with the scope test or runtime. Maven only looks for cycles in the compile phase. Eclipse or m2e doesn't differ the dependencies in scopes.
You probably have previous Eclipse settings on your projects, try this steps:
Remove all projects from Eclipse.
Run 'mvn clean eclipse:clean;' from the console or delete all hidden files from all project folders: .project, .classpath, .wtpmodules, org.eclipse.core.resources.prefs, ...
Reimport the projects into Eclipse
This may fix the problem!

Eclipse build path with other projects

I've got several projects in Eclipse (all are Maven projects) and one main project (also Maven project) which depends on the rest. I tried add this dependency by setting java build path (right click on project -> preferences -> java build path -> (tab) projects -> add). But there is a problem while executing maven install goal - this is compilation error: ... (class) ... "cannot be resolved" ... - this is definitely looks like maven does't see my resources from other projects. Eclipse is only warning me something like this: "Classpath entry /my-subproject1 will not be exported or published. Runtime ClassNotFoundExceptions may result." These warnings referenced to each subproject and occurs in main project. There is no error messages from Eclipse. In my main project, where I'm importing classes from subprojects, I can right-click on one of the import and choose "Open declaration" and there is valid reference to class from one of my subproject - so it looks like Eclipse sees my dependencies (there is no eclipse errors while building workspace - only these warnings mentioned above) from other projects, but maven doesn't see them while compilation.
Have you got any ideas how can I fix this?
Thanks for help.
You have to declare your dependencies in the pom.xml for Maven. Maven doesn't recognize any Eclipse specific configurations (like Build Path etc.): Maven Tutorial
If you use the m2eclipse plugin, it will configure your Eclipse build path according to your pom.xml configuration
Isn't this maven problem?
Maven needs jar file made from other project inside maven repository.
I don't know much about maven eclipse plugin but so far, in my observation, it seems like it works this way.
So that this case need to build other project so that create it's jar file.
But this takes so much time.