All Downloads are FREE. Search and download functionalities are using the official Maven repository.

maven_embedder.maven.clj Maven / Gradle / Ivy

The newest version!
(ns maven-embedder.maven
  "Maven embedder

   Other maven embedders:
     See m2e eclipse project for MavenImpl.java
     https://github.com/jenkinsci/lib-jenkins-maven-embedder"
  (:use
   [maven-embedder.plexus :only [lookup]])
  (:require
   [clojure.java.io :as io]
   [clojure.string :as string]
   [clojure.tools.logging :as logging])
  (:import
   java.io.BufferedInputStream
   java.util.Properties
   org.apache.maven.Maven
   org.apache.maven.cli.MavenCli
   org.apache.maven.execution.MavenExecutionRequest
   org.apache.maven.repository.RepositorySystem
   org.apache.maven.settings.Settings
   [org.apache.maven.settings.building
    DefaultSettingsBuildingRequest SettingsBuilder SettingsBuildingException]
   [org.apache.maven.execution
    DefaultMavenExecutionRequest DefaultMavenExecutionResult
    MavenExecutionRequest MavenExecutionRequestPopulationException
    MavenExecutionRequestPopulator MavenExecutionResult MavenSession]
   org.apache.maven.lifecycle.LifecycleExecutor
   [org.apache.maven.lifecycle.internal
    MojoExecutor LifecycleExecutionPlanCalculator]
   [org.apache.maven.model.building
    DefaultModelBuildingRequest ModelBuildingRequest]
   org.apache.maven.model.io.ModelReader
   [org.apache.maven.plugin
    MojoExecution BuildPluginManager]
   [org.apache.maven.project
    MavenProject ProjectBuilder]
   org.sonatype.aether.RepositorySystemSession
   org.codehaus.plexus.logging.Logger))

(defn settings [container {:keys [global-settings user-settings maven-home]}]
  (try
    (let [env (reduce
               (fn [p v]
                 (doto p
                   (.setProperty
                    (str "env." (string/upper-case (.getKey v)))
                    (.getValue v))))
               (Properties.)
               (.. (System/getenv) entrySet))
          properties (doto (System/getProperties) (.putAll env))
          _ (when maven-home (.put properties "maven.home" maven-home))
          request (doto (DefaultSettingsBuildingRequest.)
                    (.setSystemProperties properties)
                    (.setGlobalSettingsFile
                     (or (and global-settings (.exists global-settings)
                              global-settings)
                         MavenCli/DEFAULT_GLOBAL_SETTINGS_FILE))
                    (.setUserSettingsFile
                     (or (and user-settings (.exists user-settings)
                              user-settings)
                         MavenCli/DEFAULT_USER_SETTINGS_FILE)))]
      (.. (lookup container SettingsBuilder)
          (build request)
          getEffectiveSettings))
    (catch SettingsBuildingException e
      (logging/errorf
       e "Could not build settings [%s %s]. Using default settings."
       user-settings global-settings)
      (Settings.))))

(defn local-repository-path
  [^Settings settings]
  (or (.getLocalRepository settings)
      (.. RepositorySystem/defaultUserLocalRepository getAbsolutePath)))

(defn local-repository
  [container ^Settings settings]
  (.. (lookup container RepositorySystem)
      (createLocalRepository (io/file (local-repository-path settings)))))

(defn execution-request
  [container settings {:keys [offline log-level]
                       :or {offline false
                            log-level MavenExecutionRequest/LOGGING_LEVEL_INFO}
                       :as options}]
  (let [request (DefaultMavenExecutionRequest.)
        local-repo (local-repository container settings)]
    (.. (lookup container MavenExecutionRequestPopulator)
        (populateFromSettings request settings))
    (.. (lookup container Logger) (setThreshold log-level))
    (doto request
      (.setLocalRepository local-repo)
      (.setLocalRepositoryPath (.getBasedir local-repo))
      (.setOffline offline)
      ;;(.setUpdateSnapshots false)
      (.setCacheNotFound true)
      (.setCacheTransferError true)
      (.setLoggingLevel log-level))))

(defn ^RepositorySystemSession repository-session
  [container ^MavenExecutionRequest request]
  (.. (lookup container Maven) (newRepositorySession request)))

(defn maven-session
  [container ^MavenExecutionRequest request ^MavenProject project]
  (let [repo-session (repository-session container request)
        maven-session (MavenSession.
                       container repo-session request
                       (DefaultMavenExecutionResult.))]
    (when project
      (.setProjects maven-session [project]))
    maven-session))

(defn setup-execution
  [container ^MavenSession session ^MavenProject project
   ^MojoExecution execution]
  (.. (lookup container LifecycleExecutionPlanCalculator)
      (setupMojoExecution session project execution)))

(defn execute
  ([container ^MavenExecutionRequest request]
     (try
       (.. (lookup container MavenExecutionRequestPopulator)
           (populateDefaults request))
       (.. (lookup container Maven) (execute request))
       (catch Exception e
         (doto (DefaultMavenExecutionResult.) (.addException e)))))
  ([container ^MavenSession session ^MojoExecution execution]
     (let [artifacts (reduce
                      (fn [m p] (assoc m p (.getArtifacts p)))
                      {} (.getProjects session))
           ;; snapshots (reduce
           ;;            (fn [m p]
           ;;              (assoc m p (MavenProjectMutableState/takeSnapshot p)))
           ;;            {} (.getProjects session))
           restore (fn [] (doseq [project (.getProjects session)]
                            (.setArtifactFilter project nil)
                            (.setResolvedArtifacts project nil)
                            (.setArtifacts project (artifacts project))
                            ;; (when-let [s (snapshots project)]
                            ;;   (.restore s project))
                            ))
           executor (lookup container MojoExecutor)]
       (try
         (let [depend-ctxt (.newDependencyContext
                        executor session
                        (java.util.ArrayList. [execution]))]
           (.ensureDependenciesAreResolved
            executor (.getMojoDescriptor execution) session depend-ctxt))
         (.. (lookup container BuildPluginManager)
             (executeMojo session execution))
         (catch Exception e
           (.. session getResult (addException e)))
         (finally
          (restore))))))

(defn calculate-execution-plan
  [container ^MavenSession session ^MavenProject project goals setup-flag]
  (.. (lookup container LifecycleExecutor)
      (calculateExecutionPlan session setup-flag (into-array String goals))))

(defn read-model
  "Read a model from some input clojure.java.io can process."
  [container input]
  (with-open [is (BufferedInputStream. (io/input-stream input))]
    (.. (lookup container ModelReader) (read is nil))))

(defn read-project
  "Read project from pom-file"
  [container ^MavenExecutionRequest request
   ^RepositorySystemSession repo-session ^java.io.File pom-file]
  (let [cl (.. (Thread/currentThread) getContextClassLoader)]
    (try
      (.. (Thread/currentThread)
          (setContextClassLoader (.getContainerRealm container)))
      (.. (lookup container MavenExecutionRequestPopulator)
          (populateDefaults request))
      (let [project-request (doto (.getProjectBuildingRequest request)
                              (.setValidationLevel
                               ModelBuildingRequest/VALIDATION_LEVEL_MINIMAL)
                              (.setRepositorySession repo-session)
                              (.setProcessPlugins true)
                              (.setResolveDependencies true))]
        (.. (lookup container ProjectBuilder)
            (build pom-file project-request)
            getProject))
      (finally
       (.. (Thread/currentThread) (setContextClassLoader cl))))))


(comment
(def plexus (maven-embedder.plexus/plexus-container))
(def settings (maven-embedder.maven/settings
               plexus
               {:user-settings (clojure.java.io/file "/Users/duncan/.m2/settings.xml")}))
(def er (maven-embedder.maven/execution-request plexus settings {:offline true}))
(def repo-session (maven-embedder.maven/repository-session plexus er))
(def project (maven-embedder.maven/read-project
              plexus er repo-session (clojure.java.io/file "pom.xml")))
(def maven-session (maven-embedder.maven/maven-session
                    plexus
                    (maven-embedder.maven/execution-request plexus settings {})
                    project))
(def exec-plan (maven-embedder.maven/calculate-execution-plan
                plexus maven-session project ["test"] false))
(doseq [exec (.getMojoExecutions exec-plan)]
  (maven-embedder.maven/setup-execution plexus maven-session project exec)
  (maven-embedder.maven/execute plexus maven-session exec))
(.. maven-session getResult getExceptions)
)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy