Module: Jars::Mima

Defined in:
lib/jars/mima.rb,
lib/jars/mima/version.rb

Overview

Resolver backed by the Mima Java library (MIni MAven). Replaces the previous ruby-maven based resolution pipeline.

Mima wraps the Maven Resolver (Aether) API as a standalone library (no Maven process is spawned).

Defined Under Namespace

Classes: ResolvedDependency

Constant Summary collapse

MIMA_VERSION =
'2.4.42'
SLF4J_VERSION =
'2.0.17'
MAVEN_CENTRAL =
'https://repo.maven.apache.org/maven2'
MIMA_DIR =
'lib/jars/mima'
JARS =
jars.each_slice(2).to_h do |gav, sha1|
  group, artifact, version = gav.split(':')
  group = group.tr('.', '/')
  jar_file = "#{artifact}-#{version}.jar"
  [
    jar_file,
    {
      url: "#{MAVEN_CENTRAL}/#{group}/#{artifact}/#{version}/#{jar_file}",
      sha1: sha1
    }
  ]
end
@@jars_loaded =

rubocop:disable Style/ClassVars

nil

Class Method Summary collapse

Class Method Details

.context_overridesJava::eu.maveniverse.maven.mima.context.ContextOverrides

Builds a ContextOverrides from jar-dependencies configuration (local repo, user/global settings.xml).

Returns:

  • (Java::eu.maveniverse.maven.mima.context.ContextOverrides)


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/jars/mima.rb', line 35

def context_overrides
  ensure_jars_loaded

  builder = Java::eu.maveniverse.maven.mima.context.ContextOverrides.create
  builder.withUserSettings(true)

  # Local repository override
  local_repo = ::Jars.local_maven_repo
  builder.withLocalRepositoryOverride(java.nio.file.Paths.get(local_repo)) if local_repo

  # User settings.xml override
  settings = ::Jars::MavenSettings.settings
  builder.withUserSettingsXmlOverride(java.nio.file.Paths.get(settings)) if settings

  # Global settings.xml override
  global = ::Jars::MavenSettings.global_settings
  builder.withGlobalSettingsXmlOverride(java.nio.file.Paths.get(global)) if global

  builder.build
end

.create_context(overrides = nil) ⇒ Java::eu.maveniverse.maven.mima.context.Context

Creates a Mima Context. Caller is responsible for closing it.

Parameters:

  • overrides (Java::eu.maveniverse.maven.mima.context.ContextOverrides, nil) (defaults to: nil)

    optional overrides; when nil, #context_overrides is used

Returns:

  • (Java::eu.maveniverse.maven.mima.context.Context)


61
62
63
64
65
66
67
# File 'lib/jars/mima.rb', line 61

def create_context(overrides = nil)
  ensure_jars_loaded

  overrides ||= context_overrides
  runtime = Java::eu.maveniverse.maven.mima.context.Runtimes::INSTANCE.getRuntime
  runtime.create(overrides)
end

.ensure_jars_loadedObject

Loads the bundled Mima jars onto the classpath. Safe to call multiple times; only loads once.



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/jars/mima.rb', line 17

def ensure_jars_loaded
  return if @@jars_loaded

  mima_dir = File.expand_path('mima', File.dirname(__FILE__))

  load File.join(mima_dir, "slf4j-api-#{SLF4J_VERSION}.jar")
  load File.join(mima_dir, "slf4j-simple-#{SLF4J_VERSION}.jar")
  load File.join(mima_dir, "jcl-over-slf4j-#{SLF4J_VERSION}.jar")
  load File.join(mima_dir, "context-#{MIMA_VERSION}.jar")
  load File.join(mima_dir, "standalone-static-uber-#{MIMA_VERSION}.jar")

  @@jars_loaded = true # rubocop:disable Style/ClassVars
end

.resolve_artifacts(artifacts, all_dependencies: false) ⇒ Array<ResolvedDependency>

Resolves transitive dependencies for the given artifacts. Creates (and closes) its own Mima context.

Parameters:

  • artifacts (Array<Jars::GemspecArtifacts::Artifact>)

    jar dependency declarations

  • all_dependencies (Boolean) (defaults to: false)

    when true, include provided/test scoped artifacts

Returns:



75
76
77
78
79
80
81
82
# File 'lib/jars/mima.rb', line 75

def resolve_artifacts(artifacts, all_dependencies: false)
  context = create_context
  begin
    resolve_with_context(context, artifacts, all_dependencies: all_dependencies)
  ensure
    context.close
  end
end

.resolve_with_context(context, artifacts, all_dependencies: false) ⇒ Array<ResolvedDependency>

Resolves transitive dependencies using an existing Mima context.

Parameters:

  • context (Java::eu.maveniverse.maven.mima.context.Context)

    an open Mima context

  • artifacts (Array<Jars::GemspecArtifacts::Artifact>)

    jar dependency declarations

  • all_dependencies (Boolean) (defaults to: false)

    when true, include provided/test scoped artifacts

Returns:



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/jars/mima.rb', line 90

def resolve_with_context(context, artifacts, all_dependencies: false)
  deps = artifacts_to_dependencies(artifacts, all_dependencies: all_dependencies)
  return [] if deps.empty?

  collect_request = org.eclipse.aether.collection.CollectRequest.new
  deps.each { |d| collect_request.addDependency(d) }
  collect_request.setRepositories(context.remoteRepositories)

  dependency_request = org.eclipse.aether.resolution.DependencyRequest.new
  dependency_request.setCollectRequest(collect_request)

  result = context.repositorySystem.resolveDependencies(
    context.repositorySystemSession, dependency_request
  )

  root = result.getRoot
  collect_resolved(root)
end