aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt')
-rw-r--r--framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt269
1 files changed, 269 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt b/framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt
new file mode 100644
index 00000000..faec70fa
--- /dev/null
+++ b/framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt
@@ -0,0 +1,269 @@
+~~ 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.
+
+ ---
+ Offline Mode Design
+ ---
+ John Casey
+ ---
+ 08-April-2005
+ ---
+
+Offline Mode Design
+
+* UPDATE: 18-April-2005
+
+ We cannot take the approach outlined below of detecting which remote
+ repositories are "really" offline, since offline mode is more of a behavior,
+ and this will lead to counter-intuitive results. A different feature may exist
+ unimplemented, which is to detect when the network is down and provide better
+ feedback for that case. However, when offline mode is declared, nothing
+ earmarked as remote should be accessed, regardless of whether it is actually
+ a physically local resource.
+
+ NOTE: One side-effect of this design change is that all offline-mode code can
+ be isolated to maven-core, maven-plugin-descriptor, and [possibly]
+ maven-artifact. Usage of maven-wagon will be determined by an offline-aware
+ manager.
+
+* Assumptions: What is Offline?
+
+ For the purposes of determining the areas sensitive to offline status,
+ it is definitely useful to define what the offline state really means.
+
+ [[1]] This is obvious, but the network/internet is unavailable.
+
+ [[2]] Localhost (127.0.0.1) may also be unavailable if the whole
+ network stack is offline.
+
+ [[3]] "Remote" repositories referenced using the file:// protocol may
+ be available. However, if that file:// url references a
+ file-share, as in the case of an NFS or SMB mount, that will
+ be unavailable.
+
+ So, offline mode has several implications, some of which may not be
+ altogether obvious:
+
+ * Localhost may be unavailable. Therefore, even locally installed
+ server processes which work by conversing over a port may fail.
+
+ * Not all "remote" repositories will fail. Specifically, if the remote
+ repo uses the file:// protocol, and it doesn't refer to a shared
+ filesystem, it will continue to be available.
+
+ The question remaining is: Which level of offline mode will we support? It
+ seems reasonable to assume that users will be able to tell when localhost is
+ not active (in most cases, localhost should be available, even if the rest of
+ the network is not). Therefore, let's concentrate on the state where no
+ network <beyond localhost> exists, and leave the more extreme state to users
+ to diagnose and correct as necessary.
+
+* Why is Offline Mode Important?
+
+ Offline mode is essential for breaking the requirement that m2 operate in a
+ network-connected environment. It means legitimizing a development environment
+ in which there is no network connection, and providing a robust m2 service
+ offering in such circumstances. Introduction of offline mode allows m2 to
+ anticipate the inevitable network failures that accompany being physically
+ disconnected from the network, and adjust it's behavior accordingly.
+
+ It is more than simply understanding that m2 cannot go and check for the
+ latest version of some snapshot artifact. If m2 is offline, SCM operations
+ cannot succeed; no artifact downloads can take place, regardless of whether
+ they are snapshot versions; artifact deployment cannot take place; certain
+ types of tests cannot be setup, since the container used to run them cannot be
+ reached or started.
+
+ All of these operations will produce their own unique errors in the absence of
+ a coordinated offline strategy. In addition, efforts to unite these failing
+ behaviors behind a consistent user interface is much, much more difficult if
+ the system can't tell whether it has access to the network required by these
+ operations.
+
+ Offline mode really means anticipating a lack of network connectivity, and as
+ a result turning off certain services provided by m2 and providing a coherent
+ way of predicting and reporting when network-related failures will take place.
+ It means warning users that since the network is missing, certain features and
+ operations will be unavailable, rather than simply waiting for those
+ operations to fail, then trying to help users decipher the error messages they
+ get as a result.
+
+* Implications for Resolution
+
+** Dependency Resolution
+
+ This one is obvious...we only have access to the repositories using
+ the file:// protocol and living on a truly local filesystem when
+ offline.
+
+** Plugin Resolution
+
+ This is similar to dependency resolution. Plugin repositories not
+ using file:// or not residing on a local (not shared) filesystem will
+ be unavailable.
+
+
+* Implications for Mojo Execution
+
+** Deployment mojos
+
+ The concept of deployment is dependent on the availability of a some
+ remote repository. Just as above, if that repository is not using
+ file:// (which is highly likely to be the case), or the repository is
+ not on a local filesystem, deployment will fail when offline.
+
+** Testing mojos
+
+ This can be a problem if the tests are more than simple unit tests;
+ that is, if they require configuration of a server process, and
+ subsequent testing in-container.
+
+ Since we're only going to concern ourselves with states where localhost is
+ still active, we only need to worry about this case when the server container
+ is <<not>> installed on localhost. This allows the popular pattern of starting
+ a server container in-JVM, running tests against it, and shutting it down.
+
+** SCM mojos
+
+ See below for discussion on SCM-related operations. Any mojo which
+ carries out some analysis or other interaction with a SCM system
+ will likely be unavailable when in offline mode.
+
+
+* Implications for Subsystems
+
+** Maven-Wagon
+
+ Parts of Wagon will continue to function normally. These include:
+
+ * The file wagon, provided the referenced location is on a local
+ filesystem.
+
+ It is not possible to determine whether a file-based location will
+ be available except on a case-by-case basis (or a root-url by
+ root-url basis). We may want to move the offline sensitivity entirely to
+ Maven-Artifact, below, so we can be smarter about testing filesystem-based
+ repositories, etc.
+
+ * If not otherwise specified, all other wagons are assumed to be
+ remote-only, and are therefore sensitive to offline mode.
+
+** Maven-Artifact
+
+ This is wholly dependent on Maven-Wagon, above.
+
+ We could possibly use a flag on a particular Wagon to see whether it supports
+ offline mode, and then test to see if the file-based basedir for an aritfact
+ repository works...if it doesn't work, we can mark that repository offline...
+
+ OTOH, all offline-mode checks can probably be run from Wagon-based APIs.
+
+** Maven-SCM
+
+ In all but trivial examples, SCM operations cannot complete without
+ having access to the versioning server. Therefore, it is assumed that
+ any SCM-related activity will be unavailable when m2 is in offline
+ mode.
+
+** Maven-Core
+
+ We'll examine the different parts of maven-core on a case-by-case
+ basis, below:
+
+*** DefaultLifecycleExecutor
+
+ When binding goals to the project's configured lifecycle, each mojo
+ descriptor should declare whether it requires online/offline status.
+ This value should be a java.lang.Boolean, so it can implement 3VL
+ (three value logic: yes, no, don't-care). The requiresOnline
+ field in the mojo descriptor has the following semantics:
+
+ [true] Online status is required for this mojo to function
+ correctly.
+
+ [false] <<(Default)>> Either status is acceptable for the mojo to
+ execute. It doesn't care.
+
+ The majority of mojos will leave the requiresOnline == false,
+ since online/offline status will be irrelevant, provided they have
+ access to their required artifacts and other classpath elements. In the case
+ of required artifacts and other classpath elemtents, this is assumed by the
+ mojo API to be in a correct state, and will be handled by the Wagon
+ modifications.
+
+
+* Implementation Notes
+
+** Accessibility of offline status
+
+ Offline status should be indicated in the MavenSettings instance, since it
+ can conceivably be set from either the settings.xml or the command-line.
+
+ In the event the '-o' switch is the impetus for setting offline mode, this
+ should result in modification of the active profile in the MavenSettings
+ instance, just as definition of the active profile from the command-line
+ should result in similar modification. This object is not meant to be
+ static within the build process, but rather to be setup as an aggregation of
+ all settings-related information passed into the system.
+
+** Control over downloads
+
+ Find the control point for m2 using maven-wagon. At this point, inject
+ a offline status parameter which is used when retrieving the specific Wagon.
+
+ If <<<offline == true>>>:
+
+ * If the wagon is not bound to "file://", then ignore the request and print
+ a debug message.
+
+ * If the wagon is bound to "file://" then:
+
+ Retrieve the file or base-url file to be "downloaded".
+
+ * If the file (or more usefully, the base-url file) exists, proceed.
+
+ * If the file (or base-url file) doesn't exist, assume that this location
+ is part of a file-share. Ignore the request and print a debug message
+ as above.
+
+** Control over mojos in the lifecycle
+
+ When binding a mojo to the project's lifecycle instance, check the mojo
+ descriptor's requiredConnectivity field.
+
+ * If <<<(offline == true) && (requiresOnline != true)>>>, bind
+ the mojo to the lifecycle.
+
+ In this case, the client is <<offline>>, and the mojo does not require
+ online status.
+
+ * If <<<(offline == false) && (requiresOnline == true)>>>, bind
+ the mojo to the lifecycle.
+
+ In this case, the client is <<online>>, and the mojo either requires
+ <<online>> status, or else doesn't care.
+
+ * Otherwise, don't bind the mojo. Log a debug message to indicate that it is
+ sensitive the the online state of the application, and that this state is
+ currently wrong for execution.
+
+ <<NOTE:>> Do we want to fail when we cannot bind a mojo to the lifecycle
+ because of offline/online status? That would probably indicate that the user
+ was trying to do something they cannot succeed at for now...so we probably
+ should throw an exception in this case.
+
+