I am working on two projects that I deploy as two WARs (each project in its own WAR). Both projects have in the WAR the same JAR that constitutes some common code.
Each project has a bunch of project specific JAX-RS provider classes.
It seems that I am experiencing some interference btween the providers of these projects when both projects are deployed. Either no provider is found (e.g. isReadable is not even called) or a provider from one project appears to be checked as applicable during requests to the other project (e.g. I see its isReadable() being called).
This happens a bit at random and the problem disappears completely when I only deploy one of the applications.
Questions:
Has anyone else see such behavior, too?
Am I doing something wrong or is this possibly just a bug in JBoss?
Edit: am I maybe having issues with this: https://community.jboss.org/wiki/ClassLoadingConfiguration ?
Jan
Finally found the answer - it was a class loader isolation issue. Described here: http://jalg.net/2012/05/death-by-jboss-6-classloading/
Related
TL;DR -> Force code smells to apear as SonarCloud issues on IDE
I got SonarLint plugin (vscode) installed locally and configured with external SonarCloud rules (by my organization's project).
The thing is even though it is well configured, some issues fail to count as an acttual issue locally on my IDE and only apears online (e.g. github integration).
I have not yet realized what is common between those slippery sonarcloud issues, might be code smells.
I have seen some StackOverflow questions regarding that matter, but have not yet encountered an answer which explicitly suggests a workaround or a method to configure it as I wish.
Did anyone ever manage to work it out?
First day on a project and first day with Maven and I've already wasted a lot of time trying to get it to build.
It appears the issue is that this old project has config, POMs, etc, that have many broken URLs embedded in them. i.e. Maven generated stack traces are presenting lots of URLs that are broken when trying to download project dependencies.
I have been given only the project source which includes Maven config files. I have not been supplied with existing Maven repositories, project dependent libraries or any build environment, etc.
I have been hacking away at these files but I don't get very far with each build attempt.
Am I doing something fundamentally wrong or is this Maven config really stuck in 2008?
Update:
My POM really was stuck in 2008, i.e. by virtue of versioning, it is a snapshot in time while the rest of the Java world moves on.
Some of the dependencies were no longer in any repositories, most of which were defunct projects and so I've ceased to use them. I had to rewrite the entire POM. I had to spend a lot of time tweaking versions to ensure compatibility between dependencies and between plugins. After much battling; some plugins just wouldn't coexist, clobbering each other.
All in all, it was many, many hours effort...too many for this project with only one developer, and I believe I only now know enough to be dangerous.
The good ol' IDE build system would have been a better choice in this instance.
ftr's advice (in the comments section) is right: Maven can't download certain dependencies, but that doesn't necessarily mean that those dependencies don't exist anymore. It could just be that the extra-repos section of the Maven configuration is now missing certain repositories, and/or there's some other connection issue (like bad proxy config - which may lead to you being able to access certain repos but not others).
I've been in a similar situation, and found out that while initially Maven reported errors when trying to download about 80% of the dependencies, after various tweaks on Maven's config I ended up making it download all of the dependencies (well except one which was really just a custom jar somebody did and which was fetched directly from the local file system, but that's besides the point).
Here's what I'd do:
Of all the dependencies that Maven says it can't download, try to spot 2 or 3 which are "well know" (like maybe if it says it can't download Servlet or some Spring library, write down the exact URL's he's trying to contact for those).
Manually check if those URL are indeed accessible (via browser). If so, make sure that the dependencies exist for the version Maven is looking for. Maybe they have been updated since the project was created, and the old version is no longer kept. In this case, 90% of the time the solution is to simply update Maven's pom to point to the new version.
If manually checking the dependency's URL shows you that in fact the dependency exists, for the version Maven is looking for, make sure there's no proxy or some other form of internet connection "extra config" which is done for your browser, but not for Maven. If that's the case, just update Maven's config with all those extra params (proxy, proxy authentication, etc).
If the dependency URL doesn't exist at all, try googling to see if that dependency doesn't now exist on some other repo. For example many of the JBoss dependencies (like Hibernate, etc) have changed repo location somewhere around 2007-2009. If that's the case just add the new repo to Maven's repo list (and remove the old one if it no longer exists).
Finally, the good old shameful way to fix this is to go to a colleague which has (or had) something to do with your project at some point, and copy his local Maven repo to your machine :)
As far as I see every time I make a change, for example the value of a configuration variable, I have to
Make a copy of the change in each project (webapp, Android, IPhone, etc.)
Build each project
Distribute each project (besides the webapp)
I have found PhoneGap build which seems to be a great solution for the mobile part. But it's still beta and it doesn't solve everything. I still have webapp's code, which is not exactly the same.
Do you know techniques, tools or tricks, which help to improve this process?
Thanks in advance.
We are currently developing a web/Android app using PhoneGap and Sencha Touch (iOS is coming soon). So far our approach is as follows:
We have one project per platform plus several additional toolkit projects.
One platform is "primary", web in our case. This is what developers mainly use to develop and test the app. We're using jsTestDriver for testing.
During the build, the app is packaged for web in the first step. We're producing several artifacts here (.war file, tests in a .jar file).
"Secondary" platform projects do not include the source code. It gets unpackaged and copied to the right places when projects are built. This also includes tests from the primary platform.
Platform projects contain some additional code - normally only testing code, app code itself is currently cross-platform (not sure if it will stay this way).
So we're doing it mainly through advanced build scripts. We're using Maven for web and Android. iOS is coming soon (into our work, I mean), so we'll be looking for some sensible build tool there too.
We're building our projects using Hudson continuous integration.
What I have to admit is that this whole environment (multi-project Maven builds, JSTD, multi-node Hudson) is a hell of a setup, took quite an effort to figure it out.
I made my NServiceBus solution and it was all working. I then moved one of the projects to a different solution.
When I run them in that solution I get this error:
No endpoint configuration found in scanned assemblies. This usually happens when NServiceBus fails to load your assembly contaning IConfigureThisEndpoint.
I have a class in the project I am trying to get running that looks like this:
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
}
I fully copied the folder that contained this project when I moved it to the new solution. (So this is the exact same class that is in the original and the original worked perfectly.)
I am not sure what to do, so I did a bit of googling and came up on this question.
Based on the answer there, I have tried this:
Make sure that there is a class that implements IConfigureThisEndpoint
Make sure that only one class implements IConfigureThisEndpoint
Make sure that the NServiceBus libraries I am using are .NET 4 libraries
Make sure that the implementing class is public (see code above)
I don't do any non-default actions with regards to signing so delay-signing should not be an issue
Any ideas what would cause this error (besides what I have tried) would be great!
UPDATE:
I remembered that I had used the Modeler to setup the dependencies in the original project and NuGet to do it in the copied project.
So I went and compared versions. The Modeler based project was using NServiceBus 2.5.0.1496. When I used NuGet to upgrade that to NServiceBus 2.6.0.1505 (what I had in my copied project) I started getting the same error (in my original project that had previously worked just fine).
So I copied the working DLLs into my broken project and it all started working.
So I can only conclude that this is a version issue. Something with how I have set things up (defaults for the Modeler) is not compatible with version 2.6 of NServiceBus.
NuGet does not have history of the same version of NServiceBus as the Modeler tools has. I think this is an error because NServiceBus packages don't reset the build (last) number. And there is a NServiceBus version
2.6.1496,
but not a
2.5.1496
like what comes with the modeler (there is a 2.5.0.1490, but close only counts in horseshoes and hand grenades).
So I am going to have to abandon NuGet for NServiceBus (because I need the exact version that is in the Modeler or I have to figure out why I am getting this error.)
If anyone has a better way to deal with this problem I would LOVE to hear it.
I remembered that I had used the Modeler to setup the dependencies in the original project and NuGet to do it in the copied project.
So I went and compared versions. The Modeler based project was using NServiceBus 2.5.0.1496. When I used NuGet to upgrade that to NServiceBus 2.6.0.1505 (what I had in my copied project) I started getting the same error (in my original project that had previously worked just fine).
So I copied the working DLLs into my broken project and it all started working.
So I can only conclude that this is a version issue. Something with how I have set things up (defaults for the Modeler) is not compatible with version 2.6 of NServiceBus.
NuGet does not have history of the same version of NServiceBus as the Modeler tools has. I think this is an error because NServiceBus packages don't reset the build (last) number. And there is a NServiceBus version
2.6.1496, but not a
2.5.1496
like what comes with the modeler (there is a 2.5.0.1490, but close only counts in horseshoes and hand grenades).
So I am going to have to abandon NuGet for NServiceBus (because I need the exact version that is in the Modeler or I have to figure out why I am getting this error.)
Third-party libraries are often included by the appliation server you are deploying to and class with the ones included by your application. So far I have dealt with this in the simplest and hackiest way possible: removing the libraries on the app server.
In our case it is ok, noone is relying on the app server to provide them with any libraries. But if I were running my app along with lots of other peoples app, which again might depend on the libraries included by the application server, this would not be a solution.
How is this supposed to be solved (cleanly)? How are you doing it?
An example of a problem might be this:
you build an jax-rs application using cxf, hibernate and jackson, and deploy to glassfish 2.1.1. glassfish supplies the asm 3.1 library, but this causes clashes with hibernate using an incompatible 1.5 version. similarly the application needs jackson 1.8.2 (due to a bug fix), but glassfish 2.1.1 ships with version 0.9. BOOM. Any way of fixing this other than simply removing offending libraries?
consider using :
asadmin deploy --libraries ...