On 15 Dec 06, at 6:41 PM 15 Dec 06, Jason Dillon wrote:

this change really killed me for all of the build automation I have been working on... and was one of the reasons why I had warned against using this style of versioning.

basically since this was removed, checking out the specs project and building it produces nothing, except for this:

    org/apache/geronimo/specs/specs/maven-metadata-local.xml
    org/apache/geronimo/specs/specs/1.2/specs-1.2.pom
    org/apache/geronimo/specs/specs/1.2/specs-1.2-site.xml

since my automation setup actually builds projects, then holds on to the *exact* build output for use by a project which depends on them, anything that depends on a spec which is not already released and propagated to central and its mirrors will fail. This means that anything that needs a snapshot will always fail.

 * * *

one critical error I believe that everyone is making is thinking that deployed artifacts are permanent...

Deployed releases that we place in the repository are most certainly permanent. Snapshots can be transient depending on the policy of the repository. What I've been told is that infrastructure is telling you to remove old versions from the repository at Apache which can have disasterous effects. Your artifacts deployed to central should not disappear so I'll go make sure that we're not deleting files that have been removed from the source. But we generally assume when we are syncing from a source that the source knows what it's doing. If you delete stuff on this end then we expect you to understand what effect that will have on your clients.

which they are most certainly not, so we should generally always build from source to ensure that everything is being included at the right version.

No you shouldn't. That defeats the entire purpose of Maven. You have unmaintainable and non-reproducible builds because you have such a massive number of SNAPSHOTs and you never make any incremental releases. What do you expect when you're building upon sand? Get the producers of your artifacts to release things more frequently, this ensures that SNAPSHOTs are removed from the chain. I look in your server build and you've got SNAPSHOTS **all** over the place. OpenEJB, ActiveMQ, Tranql, your spec JARs. You control, or have relationships with most of these projects. You don't wait until it's time to release to get the producers of your dependencies to crap out some junk you can use. Get them release, lock your stuff down to it, move on. Repeat. You should have no SNAPSHOTs other then ones for your own projects in your POMs. If everything is changing everywhere it's total insanity. Build everything from source is not something you should be doing because you should not have to. It is one of the most obvious signifiers that you are doing something very wrong. You have way too many points of variation and all your projects seem to be in constant swing with one another. If that's the case it begs the question whether they really separate and why not just lump them all together if they are so coupled together. Which generally the case when you cannot eliminate SNAPSHOTs from your build. When you see SNAPSHOT not from your project in our POM it is a warning sign.

IMO the remote repos are for user connivence *ONLY*,

That is horse shit. What they contain is a product of what you people put in them. You guys for example have something that is tagged, which you released and which is not reproducible. That's not Maven's fault, that's your fault. You are hosing anyone trying to consume your stuff. And if people are doing that to you then your should irate like anyone should be who looks at your tag for 1.1.1. That's why the release plugin behaves the way it does. It screamed at you when you tried to release that 1.1.1 tag I bet and you side stepped what you should have done and did something manually.

so that you don't need to always go and build everything. For automated builds it is much easier to build projects one by one, hold on to the exact outputs, then use those outputs as dependencies directly to ensure that dependent builds use the right artifacts.

That is just so wrong if you're using Maven. Why do you go have to build everything? It's because your dependency chain consists of so many transient SNAPSHOTs that you can't possibly rely on anything. Start in your specs and release them, when you have resolved a few issues bump the micro number and release again. Eliminate them anywhere you can. Releasing is not painful with the release plugin when you have your SNAPSHOTs under control.


if the project is not going to build as one might expect when running `mvn install` from the root.... and if that is because you want to version each of those bits separately and use the half- functional maven release plugin to handle releases... then each of these really needs to be a self-contained project.

You guys seem to want to use the release plugin for releasing things with SNAPSHOTs in them. That's not what it was made for and again it's a function of you not managing your relationships with your dependent projects. A release with SNAPSHOTs is not a release. Tagging something that contains a POM with a SNAPSHOT identifier is completely useless. I mean look at your 1.1 release:

http://svn.apache.org/repos/asf/geronimo/server/tags/1.1.1/

That's insane. That's a tag! How did you do a release with SNAPSHOTs? That's not Maven's fault if you can't built that again if you were careless enough to tag something with SNAPSHOTs. You have got to use releases of plugins, parent POMs, and dependences more frequently. Maven has lots of bugs, sure, but this mess is largely your own doing. There are lots of Maven users with way more source code and modules then you and don't have nearly the number of problems you do.


I really feel that the little short-cuts and side-steps around maven problems are going to kill us. And really, I don't see how any medium to large sized group can effectively use maven to manage releases of their projects...

Lots of projects do it fine. Your dependency chain is fragile which is the problem. Your coupling is too high which will not let you do releases as you have to, or you are not working with the producers of your dependencies to create releases. In trunk right now you have a SNAPSHOT for the POM that seems to contain the dependencies for everything you need. That's wrong. You need to release those parent POMs and the dependencies in them. It is natural to have SNAPSHOTs for the project in question, for CI and while you're developing. But a SNAPSHOT in a dependency means that you, as a last resort, had to use something in flux because it cannot work otherwise. This immediately should signal you to contact that project to fix it, and release it. And again, because all your dependent projects seem to share many of the developers you should be able to do that.

especially not by following in the footsteps of the mvn community wrt they way it versions its components or assumes that remote repositories always contain permanent artifacts which are always trusted.


We will have to start not deleting anything from the source side. We have always left the "match sides" option on for rsync so that people could manage their own emergencies if they really needed to pull something out. But our policy for things that we have added to central is never to delete them. You must release and use releases if you want stability. If you are managing your own SNAPSHOT repository then you decide what stays or goes. If you want them to remain forever then don't delete them. In Maven 1.x we never removed SNAPSHOTs from Ibiblio either. The stability of your repositories is entirely your doing. If you don't want us to delete from our side then you have to tell us. We have made the assumption that the source is careful enough not to burn their clients. We can't watch everything. And we do have a fundamental problem at Apache where infrastructure doesn't seem to know how Maven works and don't really care too. We would be "bothering" them as I was told by a ember of the infra team the other day (another story). I have a pending proposal which asks if Contegix can be an official part of the Apache infrastructure and I would like them to manage all release and snapshot repositories which would give us consistent policies. Then the repositories will be happy and we won't be "bothering" infrastructure here.

There are changes that Dan Fabulich is proposing to deal with massive degrees of flux which is modeled on the build system he's helped create at his workplace which builds of revision numbers and the system feeds those back to dependent projects. Within a project that essentially removes the notion of a SNAPSHOT. This would still not help you with your current setup because you have dependencies not within your project that are SNAPSHOTs. At some point I could see there being a central messaging system that could feed these revision changes around the world to any subscriber if they wanted to lock onto a revision but that too would not help you because eventually you need to use a release which is documented and the API locked down.

You are trying to work around the fact that your dependency chain is so hosed all you can do is cry. I'm looking through what you call releases and you're obviously not using the release plugin so your nightmares are of your own making so stop blaming Maven for your problems when you're using it wrong. It seems like the scenario is "Oh shit, it's time to do a release. Damn, why won't the release plugin let me release with SNAPSHOTs? Damn, Maven blows. We're going to have to do this by hand so we can release this stuff with snapshots" and then you start hand tagging stuff and jilting stuff around maybe diddling with the repository? And that gets you into a world of trouble. You have to prepare for a release a long time in advance. Anyone watching me trying to prepare for releases of plugins will see that I've spent a long time releasing all their dependent projects and it takes time and is not all that interesting or fun. In order to make the licensing changes I wanted I had to modify many pieces at once, but the second it all worked I released all the pieces, their parent POMs and locked the client projects to those released versions. The only fundamental flaw in the release plugin right now is that it won't easily release a parent POM. Aside from that if you can't use the release plugin then you're doing something wrong somewhere.

Building everything from source is an indicator of severe problems.

Seeing tagged releases with SNAPSHOTs in them is an indication of severe problems.

Your repository whimsically shifting around is an indicator of severe problems.

None of these are inherently Maven's fault

Jason.

--jason


Reply via email to