blob: eabb6632ff6db36fd25e59b52ee7c7e0120b5591 [file] [log] [blame]
====
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
====
Maven Artifact is supposed to be a general artifact mechanism for retrieving, installing, and deploying artifacts
to repositories. Maven Artifact was originally decoupled from Maven proper and as such carries a lot of baggage
which prevents it from being used generally and carries many notions that are very specific to Maven itself. Artifacts
currently have a notion of scope, classifiers, and behavioral attributes such as whether scopes should be inherited.
For any mechanism to work generally these baked in notions need to be removed, vetted, and then made compatible with
notions currently in Maven. A list of things that should not be in the Artifact:
* scope
* classifier
* dependency filter
* dependency trail
* resolved
* released
* optional
* available versions
These are all attributes of the target system
*Removal of the ArtifactFactory
3 February 2008 (Sunday)
I have removed the factory and left only a small set of constructors (which I would like to reduce to one) so that you
have a valid artifact after construction. I have also started to hide the VersionRange creation. You just pass in
a string and the constructor for the DefaultArtifact will do the right thing. This will ultimately need to be more
pluggable as different versioning strategies happen. But variations of the theme like Maven, OSGi, will have their
own subclasses and tools to operate on the graphs of dependencies.
4 February 2008 (Monday)
John:
Some notes about classifiers taken from the mailing list in a discussion with John about classifiers:
I'd tend to disagree about classifier not being a 'core' part of the artifact system...it distinguishes a main
artifact from one of its derivatives, and serves as a pretty foundational part of how we retrieve artifacts from existing
remote repositories. Without it, I doubt that you can reconstruct the path to some existing artifacts (like sources or javadocs)
reliably without bastardizing the version string.
We can see that the artifact system has certain inescapable identity attributes. Scope is obviously more related
to how an artifact is used, since you can't see any trace of scope in the artifact as it's been deployed on a remote
repository. Classifier, however, doesn't fit this criteria...it's not a usage marker, but an identity marker.
The rest I agree with.
Jason:
This is where I think you've already baked in what you think about Maven. Look at how we deploy our derivative
artifacts right now. We don't track any of it in the metadata when we deploy. We toss it up there and things hope
they are there. Like javadocs, or sources. I think what's more important is that the coordinate be unique and we
have a way to associate what ever artifacts together in a scalable way. So you say "I want to associate this artifact
with that one, this is how I would like to record that relationship in the metadata.". Subsequently you can query
the metadata and know these relationships. We currently don't do this. It generally boils down to a bunch of
coordinates in the repository. How we choose to relate them via the metadata. We have all sort of problems with
classifiers currently because it was an adhoc method of association. A general model of association would be a
superset of what we currently do for classifiers. I agree we need an mechanism for association, I don't think
classifiers have worked all that well.
5 February 2008 (Tuesday)
The rework of the artifact resolution mechanism is an attempt to entirely separate 1) the process of metadata retrieval into
a tree, 2) converting the tree to a graph by a process of conflict resolution, and 3) retrieving the complete set
of artifacts, and ultimately 4) Doing something in a particular fashion withe the retrieved set like make a classpath.
Currently we have an incremental processing model that doesn't let a complete graph be formed for analysis
which greatly complicates the process whereas having a graph and using standard graph analysis techniques and graph
optimization is the only reasonable way forward. There should be no doubt about what needs to be retrieved once the
analysis is complete. We could actually create an aggregrate request where instructions are sent to retrieve everything
required. The server could send a stream all the artifacts back in one shot.
What Oleg is attempting to do is create a working solution for 1) and 2) above. Along with the implementation we also
have a visualization tool that will help us determine what exactly the correct analysis is. The beauty of this is that
regardless of the analysis we arrive at a representation of the complete set can be modeled and we can start working on
the optimized retrieval mechanism. We still need to do some work to separate out 4) as we're doing some classpath
calculations already which we will need to further decouple but that should be relatively straight forward.
7 February 2008 (Friday)
The number of methods in the artifact factory is simply insane, for each type that we ended up with in Maven just started
being effectively hard-coded in the factory which is totally unscalable, any new types with handlers become a nightmare
to maintain. I have reduced everything to two constructors in the DefaultArtifact and I would like to reduce it to being
one. Right now I have to account for needing to use a version string, or creating a range which is completely confusing
to anyone using the API. You should just need one constructor with a version string and everything else should be taken
care of for you. Right now there are bits of code all over the place that do the if/else versionRange detection.
inheritedScope goes away entirely from the model when a graph is used because the scope selected will be a function of
how the graph is processed.
24 May 2008
1. Retrieval & Storage
There is the task of retrieving a set of resources from a data source atomically. Simple, and safe retrieval. Period. This has nothing to do with
dependency management per se, but is the basis of any safe and reliable dependency management system. We need to deal with repository corruption
and recovery as well. The method employed by GIT with hierarchical checksums provides an efficient means to detect where in a repository corruption
has occured to make sure the problem can be correct, shunted around, or simply bring it to the users attention.
2. Representation Processing
There is the task of processing the representation of an artifact. In the case of Maven an artifact's representation is encapsulated in
a POM. If the representation refers to other representations i.e. dependencies then these have to be taken into account as well. The system
may allow transitive processing and this is where the real power of a dependency management system comes into play. The representations are
gathered into a tree structure where the flavour of the system imparts special processing on this tree to yield a graph.
Once the representation has been processed and we have a graph, we fall back to the retrieval mechanism to place the desired artifacts in
the storage system. Ultimately from this graph, according to the desired purpose we have set of artifacts that we can do something with.
Processing
I have come to the conclusion that providing the necessary support for version ranges cannot be done without a SAT solver, as we are
approaching an NP complete problem and we're going to end up with an approximation and all the heavy lifting is being done already by SAT4J.
The Quality of providers
The new processing model will allow the complete manipulation of the resultant set either in memory, or in a location that does not pollute the
local repository. So any provider must guarantee the safe retrieval of the set the artifacts from remote sources, but must also guarantee the safe
placement of that set into the local repository and if the user aborts, or the machine crashes that the provider supplies a means to the
process to clean up anything half-baked. We need to provide a single place where a journal can be written which can be easily
detected and any action taken if partially complete operations have been detected. We know what can go wrong and every possible measure
needs to make sure the repository cannot be corrupted.