Giter VIP home page Giter VIP logo

pomegranate's Introduction

Pomegranate

A sane Clojure API for Maven Artifact Resolver + dynamic runtime modification of the classpath.

Clojars Project cljdoc badge CI tests Vulnerability Scan Slack chat

Used In…​

Some projects that use Pomegranate are:

  • Leiningen - For automating Clojure projects without setting your hair on fire

  • deps-deploy - Deploy your stuff

  • clj-new - Generate new projects based on clj, Boot, or Leiningen Templates!

  • MrAnderson - Dependency inlining and shadowing

  • enrich-classpath - Enriches Lein/deps.edn dependency trees with Java sources, JDK sources, javadocs, etc

  • nrepl-middleware - Websocket relay, Eval sniffing, core.async client, notebook rendering

  • saite - Interactive document creation for exploratory graphics and visualizations

  • Genie - Run Clojure scripts with a daemon process

Are you using Pomegranate? Let us know and we’ll add your project here!

People

Founders

Current Active Maintainers

License

Copyright © 2011-2017 Chas Emerick and all other contributors.
Licensed under the EPL, see epl-v10.html for details.

pomegranate's People

Contributors

arichiardi avatar cemerick avatar chouser avatar deraen avatar ehashman avatar emlyn avatar glts avatar hugoduncan avatar hypirion avatar juergenhoetzel avatar jumarko avatar kumarshantanu avatar lread avatar marcobiscaro2112 avatar michaelklishin avatar nwjsmith avatar rovanion avatar ryfow avatar seancorfield avatar slipset avatar technomancy avatar tobias avatar trptcolin avatar vedang avatar vemv avatar viatatribal avatar xeqi avatar zamaterian avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pomegranate's Issues

Upgrade to a more recent stable Clojure version

Pomegranate declares a dependency on Clojure 1.3.

According to the Clojure API doc on GitHub, 1.3 is ‘legacy’. The oldest
release that’s still marked ‘stable’ is 1.6. The current version is 1.8.

Would you consider upgrading Clojure to a more recent stable version?
1.6, 1.7, 1.8? (I’m finding it a little difficult to set up a dev
environment for 1.3.) Thank you!

add-classpath silently fails under swank

When used under swank-clojure (1.3.3), pomegranate silently to modify the classpath such that the newly-added dependencies are available to the default class loader. Example session:

; SLIME 20100404
user> (use '[cemerick.pomegranate :only [add-dependencies]])
nil
user> (add-dependencies '[[org.clojure/algo.monads "0.1.0"]])
nil
user> (require 'clojure.algo.monads)
; Evaluation aborted.
user> *e
#<RuntimeException java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate clojure/algo/monads__init.class or clojure/algo/monads.clj on classpath: >

Optionally succeed even if not all dependencies can be resolved

This has applications in e.g. visualizing the dependency hierarchy to determine where a bad dep is being pulled in from, as described in technomancy/leiningen#642.

The tree returned from resolve-dependencies should be as complete as possible, including the failed dependency (perhaps with some metadata to indicate the failure, instead of a :file to indicate a resolved and downloaded dep).

Import loaded class

How can I import classes from added jars?
This fails with error:

(cemerick.pomegranate/add-classpath "~/.m2/repository/com/my/myjar.jar")
(import 'com.my.Klass)
1. Unhandled java.lang.ClassNotFoundException
    com.my.Klass

       URLClassLoader.java:  381  java.net.URLClassLoader/findClass
   DynamicClassLoader.java:   69  clojure.lang.DynamicClassLoader/findClass
          ClassLoader.java:  424  java.lang.ClassLoader/loadClass
   DynamicClassLoader.java:   77  clojure.lang.DynamicClassLoader/loadClass
          ClassLoader.java:  357  java.lang.ClassLoader/loadClass
                Class.java:   -2  java.lang.Class/forName0

Dynamic classloader with "~/.m2/repository/com/my/myjar.jar" still presents in the REPL for few minutes then disappears. But I can't import my classes from this jar.

Support SSH Wagon

Greetings,

We have an internal Maven repository which can only be published to over SCP. We believe that if this plugins supports the SSH plugin, we will be able to use it to publish to that internal repository.

Here's a link to the wagon:

http://maven.apache.org/wagon/wagon-providers/wagon-ssh-external/index.html

If folks have pointers on how easy/hard it would be to extend the plugin, I would be happy to do it myself.

Thanks!

Stephen Starkey.

File repositories always fail on existence checks

"File" repositories (repositories using a file: uri) fail artifact existence checks with "IllegalArgumentException: number of transferred bytes cannot be negative". This is due to an upstream bug in sonatype-aether.

For a discussion and patch, see: https://bugzilla.redhat.com/show_bug.cgi?id=1118341

A workaround is to delete the offending cached artifact(s) from your ~/.m2 repository to force a new "download" rather than existence check.

This would be fixed (presumably) by the move to eclipse-aether in the PR here: #70

Allow central to be omitted

Looks like there's currently no way to opt out of maven central in the repos list; should probably add that.

Please tag 0.3.1 release

Would it be possible for you to tag the 0.3.1 release? GitHub appears to be missing it.

Commit: ba0a76f

This would be helpful as I am attempting to upgrade the version of this package uploaded to Debian for facilitating the packaging of Leiningen 2, and the current packaging relies on original tarballs being available.

Deploying over wagon-http does not send checksums

While exploring what it would take add standard http deploy ability to clojars I found out that wagon-http fails to send checksum files. A bug report is at http://jira.codehaus.org/browse/WAGON-353, and it was fixed in 2.1.

If wagon-http is bumped to 2.1 then checksums are sent but a spurious println was included http://osdir.com/ml/general/2011-11/msg37110.html

If wagon-http is bumped to 2.2, with or without the shaded classifier, then things fail with

Exception in thread "pool-1-thread-1" java.lang.NoSuchMethodError: org.apache.maven.wagon.shared.http4.AbstractHttpClientWagon.getReadTimeout()I

It looks like this version is what is used in maven 3.0.4, so I'll probably spend some more time tracking down what is happening here.

Another possibility is to use aether-connector-async similar to aether-connector-file. This allows removing wagon-http and will send checksums. However, it brings in slf4j and a non-trivial amount of dependencies, and will throw a NPE when creating a transfer-event and there was not an exception.

Add support for RepositoryListeners

Would allow for notifications of e.g. artifact installations and deployments, among other things. Implementation should be straightforward given the existing pattern of implementation for TransferListeners

The Incanter example doesn't work with clojure-1.8.0

I'm running this code snippet:

(use '[cemerick.pomegranate :only (add-dependencies)])
(add-dependencies :coordinates '[[incanter "1.5.7"]]
                  :repositories (merge cemerick.pomegranate.aether/maven-central
                                       {"clojars" "https://clojars.org/repo"}))
(require '(incanter core stats charts))

It doesn't work either with clojure-1.8.0 or with clojure-1.7.0. It does work with clojure-1.6.0.

`lein repl` won't start at all with this in :dev-dependencies

I added this to my :dev-dependencies for an empty, new project (under Windows XP), and got this exception:

PS C:\mydocs\Clojure\pomgr-test> lein repl
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at jline.ConsoleRunner.main(ConsoleRunner.java:69)
Caused by: java.lang.NoSuchMethodError: org.codehaus.plexus.DefaultPlexusContainer.initialize()V (maven.clj:18)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2911)
        at clojure.lang.Compiler$InstanceFieldExpr.eval(Compiler.java:950)
        at clojure.lang.Compiler$DefExpr.eval(Compiler.java:361)
        at clojure.lang.Compiler.eval(Compiler.java:5429)
        at clojure.lang.Compiler.load(Compiler.java:5857)
        at clojure.lang.RT.loadResourceScript(RT.java:340)
        at clojure.lang.RT.loadResourceScript(RT.java:331)
        at clojure.lang.RT.load(RT.java:409)
        at clojure.lang.RT.load(RT.java:381)
        at clojure.core$load$fn__4511.invoke(core.clj:4905)
        at clojure.core$load.doInvoke(core.clj:4904)
        at clojure.lang.RestFn.invoke(RestFn.java:409)
        at clojure.core$load_one.invoke(core.clj:4729)
        at clojure.core$load_lib.doInvoke(core.clj:4766)
        at clojure.lang.RestFn.applyTo(RestFn.java:143)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$load_libs.doInvoke(core.clj:4800)
        at clojure.lang.RestFn.applyTo(RestFn.java:138)
        at clojure.core$apply.invoke(core.clj:544)
        at clojure.core$use.doInvoke(core.clj:4880)
        at clojure.lang.RestFn.invoke(RestFn.java:513)
        at leiningen.deps$eval329$loading__4410__auto____330.invoke(deps.clj:1)
        at leiningen.deps$eval329.invoke(deps.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        at clojure.lang.Compiler.eval(Compiler.java:5415)
        at clojure.lang.Compiler.load(Compiler.java:5857)
        at clojure.lang.RT.loadResourceScript(RT.java:340)
        at clojure.lang.RT.loadResourceScript(RT.java:331)
        at clojure.lang.RT.load(RT.java:409)
        at clojure.lang.RT.load(RT.java:381)
        at clojure.core$load$fn__4511.invoke(core.clj:4905)
        at clojure.core$load.doInvoke(core.clj:4904)
        at clojure.lang.RestFn.invoke(RestFn.java:409)
        at clojure.core$load_one.invoke(core.clj:4729)
        at clojure.core$load_lib.doInvoke(core.clj:4766)
        at clojure.lang.RestFn.applyTo(RestFn.java:143)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$load_libs.doInvoke(core.clj:4800)
        at clojure.lang.RestFn.applyTo(RestFn.java:138)
        at clojure.core$apply.invoke(core.clj:544)
        at clojure.core$use.doInvoke(core.clj:4880)
        at clojure.lang.RestFn.invoke(RestFn.java:513)
        at leiningen.compile$eval323$loading__4410__auto____324.invoke(compile.clj:1)
        at leiningen.compile$eval323.invoke(compile.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        at clojure.lang.Compiler.eval(Compiler.java:5415)
        at clojure.lang.Compiler.load(Compiler.java:5857)
        at clojure.lang.RT.loadResourceScript(RT.java:340)
        at clojure.lang.RT.loadResourceScript(RT.java:331)
        at clojure.lang.RT.load(RT.java:409)
        at clojure.lang.RT.load(RT.java:381)
        at clojure.core$load$fn__4511.invoke(core.clj:4905)
        at clojure.core$load.doInvoke(core.clj:4904)
        at clojure.lang.RestFn.invoke(RestFn.java:409)
        at clojure.core$load_one.invoke(core.clj:4729)
        at clojure.core$load_lib.doInvoke(core.clj:4766)
        at clojure.lang.RestFn.applyTo(RestFn.java:143)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$load_libs.doInvoke(core.clj:4800)
        at clojure.lang.RestFn.applyTo(RestFn.java:138)
        at clojure.core$apply.invoke(core.clj:544)
        at clojure.core$use.doInvoke(core.clj:4880)
        at clojure.lang.RestFn.invoke(RestFn.java:483)
        at leiningen.repl$eval317$loading__4410__auto____318.invoke(repl.clj:1)
        at leiningen.repl$eval317.invoke(repl.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        at clojure.lang.Compiler.eval(Compiler.java:5415)
        at clojure.lang.Compiler.load(Compiler.java:5857)
        at clojure.lang.RT.loadResourceScript(RT.java:340)
        at clojure.lang.RT.loadResourceScript(RT.java:331)
        at clojure.lang.RT.load(RT.java:409)
        at clojure.lang.RT.load(RT.java:381)
        at clojure.core$load$fn__4511.invoke(core.clj:4905)
        at clojure.core$load.doInvoke(core.clj:4904)
        at clojure.lang.RestFn.invoke(RestFn.java:409)
        at clojure.core$load_one.invoke(core.clj:4729)
        at clojure.core$load_lib.doInvoke(core.clj:4766)
        at clojure.lang.RestFn.applyTo(RestFn.java:143)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$load_libs.doInvoke(core.clj:4800)
        at clojure.lang.RestFn.applyTo(RestFn.java:138)
        at clojure.core$apply.invoke(core.clj:542)
        at clojure.core$require.doInvoke(core.clj:4869)
        at clojure.lang.RestFn.invoke(RestFn.java:409)
        at leiningen.core$resolve_task.invoke(core.clj:202)
        at leiningen.core$apply_task.invoke(core.clj:252)
        at leiningen.core$_main.doInvoke(core.clj:321)
        at clojure.lang.RestFn.invoke(RestFn.java:411)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.RestFn.applyTo(RestFn.java:133)
        at clojure.core$apply.invoke(core.clj:542)
        at leiningen.core$_main.invoke(core.clj:324)
        at user$eval291.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        at clojure.lang.Compiler.eval(Compiler.java:5391)
        at clojure.core$eval.invoke(core.clj:2382)
        at clojure.main$eval_opt.invoke(main.clj:235)
        at clojure.main$initialize.invoke(main.clj:254)
        at clojure.main$script_opt.invoke(main.clj:270)
        at clojure.main$main.doInvoke(main.clj:354)
        at clojure.lang.RestFn.invoke(RestFn.java:458)
        at clojure.lang.Var.invoke(Var.java:377)
        at clojure.lang.AFn.applyToHelper(AFn.java:174)
        at clojure.lang.Var.applyTo(Var.java:482)
        at clojure.main.main(main.java:37)
        ... 5 more
Caused by: java.lang.NoSuchMethodError: org.codehaus.plexus.DefaultPlexusContainer.initialize()V
        at org.codehaus.plexus.embed.Embedder.start(Embedder.java:216)
        at leiningen.util.maven$fn__881.invoke(maven.clj:18)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2906)
        ... 109 more
PS C:\mydocs\Clojure\pomgr-test>

snapshots are returned with timestamps

Talking to @cemerick on irc it was determined resolve-dependencies should return the version with -SNAPSHOT instead of -timestamp.

This may be as simple as using .getBaseValue on the Artifact.

There was further discussion of an option for returning -timestamp deps, so that may need to be considered.

Cannot add dependency: Could not obtain transporter factory for http://build.clojure.org/snapshots

When I run

(use '[cemerick.pomegranate :only (add-dependencies)])
(add-dependencies :coordinates '[[incanter "1.2.3"]]
                     :repositories (merge cemerick.pomegranate.aether/maven-central
                                          {"clojars" "https://clojars.org/repo"}))

I get this error:

18-06-07 09:31:25 Jurajs-MacBook-Pro.local DEBUG [org.eclipse.aether.internal.impl.DefaultTransporterProvider:144] - Could not obtain transporter factory for clojure-snapshots (http://build.clojure.org/snapshots, default, releases+snapshots)
                                                                          clojure.core/eval                                 core.clj: 3206
                                                                                        ...
                                                                              user/eval5274                                REPL Input
                                                                                        ...
                                                      cemerick.pomegranate/add-dependencies                          pomegranate.clj:   57
                                                      cemerick.pomegranate/add-dependencies                          pomegranate.clj:   83
                                                                         clojure.core/apply                                 core.clj:  657
                                                                                        ...
                                           cemerick.pomegranate.aether/resolve-dependencies                               aether.clj:  809
                                           cemerick.pomegranate.aether/resolve-dependencies                               aether.clj:  815
                                                                         clojure.core/apply                                 core.clj:  657
                                                                                        ...
                                          cemerick.pomegranate.aether/resolve-dependencies*                               aether.clj:  707
                                          cemerick.pomegranate.aether/resolve-dependencies*                               aether.clj:  806
                                                                                        ...
               org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies             DefaultRepositorySystem.java:  350
            org.eclipse.aether.internal.impl.DefaultDependencyCollector.collectDependencies          DefaultDependencyCollector.java:  263
                        org.eclipse.aether.internal.impl.DefaultDependencyCollector.process          DefaultDependencyCollector.java:  360
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  372
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  467
                      org.eclipse.aether.internal.impl.DefaultDependencyCollector.doRecurse          DefaultDependencyCollector.java:  513
                        org.eclipse.aether.internal.impl.DefaultDependencyCollector.process          DefaultDependencyCollector.java:  360
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  372
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  467
                      org.eclipse.aether.internal.impl.DefaultDependencyCollector.doRecurse          DefaultDependencyCollector.java:  513
                        org.eclipse.aether.internal.impl.DefaultDependencyCollector.process          DefaultDependencyCollector.java:  360
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  372
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  467
                      org.eclipse.aether.internal.impl.DefaultDependencyCollector.doRecurse          DefaultDependencyCollector.java:  513
                        org.eclipse.aether.internal.impl.DefaultDependencyCollector.process          DefaultDependencyCollector.java:  360
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  372
              org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency          DefaultDependencyCollector.java:  418
    org.eclipse.aether.internal.impl.DefaultDependencyCollector.getArtifactDescriptorResult          DefaultDependencyCollector.java:  528
org.eclipse.aether.internal.impl.DefaultDependencyCollector.resolveCachedArtifactDescriptor          DefaultDependencyCollector.java:  544
org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor     DefaultArtifactDescriptorReader.java:  199
               org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom     DefaultArtifactDescriptorReader.java:  268
                   org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact             DefaultArtifactResolver.java:  232
                  org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts             DefaultArtifactResolver.java:  255
                           org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve             DefaultArtifactResolver.java:  430
                  org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads             DefaultArtifactResolver.java:  525
 org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider.newRepositoryConnector  DefaultRepositoryConnectorProvider.java:  122
             org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory.newInstance     BasicRepositoryConnectorFactory.java:  189
                         org.eclipse.aether.connector.basic.BasicRepositoryConnector.<init>            BasicRepositoryConnector.java:  124
                 org.eclipse.aether.internal.impl.DefaultTransporterProvider.newTransporter          DefaultTransporterProvider.java:  119
                       org.eclipse.aether.transport.file.FileTransporterFactory.newInstance              FileTransporterFactory.java:  101
                                   org.eclipse.aether.transport.file.FileTransporter.<init>                     FileTransporter.java:   51
org.eclipse.aether.transfer.NoTransporterException: Unsupported transport protocol http

I have no idea where this "http://build.clojure.org/snapshots" is coming from. I tried to clean up ~/.lein/profiles.clj to make sure there's only pomegranate dependency but no luck.

Checking URL existence in add-classpath

add-classpath does not check whether the given url (i.e. anything coercable via io/file) exists.
This complicates debugging of ClassNotFoundException which were due to a nonexistent url being added to the classpath.
If there is no use case that must work with a nonexistent url, add-classpath should be patched to throw an error for a nonexistent url.

Allow modifiying the repository-session

After exploring #50 and finding it didn't work 100%, I dove in to find out how the version collision merging works in Aether before it decides which jar to use. This mechanism provides a way to error on version ranges. However, it requires being able to change the DependencyGraphTransformer on the RepositorySystemSession.

I'm not sure the best way to provide access to do this. Some options I can think of:

  1. Pass in a function that gets called with the results of repository-session.
  2. Pass in a DependencyGraphTransformer that gets composed with the one already in the repository-session.
  3. Pass in a RepositorySystemSession
  4. Pass in a function that makes a RepositorySystemSession, and takes arguments like repository-session.

As a motivating example, using option 1, I can define

(defn- check-for-range [node parents]
  (prn node)
  (prn (.getDependency node))
  (if-let [d (.getDependency node)]
    (prn (.getFile (.getArtifact d))))
  (if-let [vc (.getVersionConstraint node)]
    (if-not (empty? (.getRanges vc))
      (throw (ex-info (str (->> (conj parents node)
                                (map #(if-let [dependency (.getDependency %)]
                                        (if-let [artifact (.getArtifact dependency)]
                                          (str "["
                                               (.getGroupId artifact)
                                               "/"
                                               (.getArtifactId artifact)
                                               " \""
                                               (.getVersionConstraint %)
                                               "\"]"))))
                                (remove nil?)
                                (interpose " -> ")
                                (apply str))
                           " version range bad!!")
                      {}))))
  (every? #(check-for-range % (conj parents node))
          (.getChildren node)))

(defn add-no-ranges-transformer [session]
  (.setDependencyGraphTransformer
       session
       (ChainedDependencyGraphTransformer.
        (into-array DependencyGraphTransformer
                    [(reify DependencyGraphTransformer
                       (transformGraph [self node context]
                         (check-for-range node [])
                         node))
                     (.getDependencyGraphTransformer session)]))))

This allows me to get output like:

tester.core> (ae/resolve-dependencies
              :coordinates '[[net.cgrand/regex "1.1.0"] [org.clojure/clojure "1.4.0"]]
              :repositories (merge ae/maven-central {"clojars" "https://clojars.org/repo"})
              :modify-session add-no-ranges-transformer)
ExceptionInfo [net.cgrand/regex "1.1.0"] -> [org.clojure/clojure "[1.2.0,)"] version range bad!!  clojure.core/ex-info (core.clj:4227)

tester.core> (ae/resolve-dependencies
              :coordinates '[[net.cgrand/regex "1.1.0"]]
              :repositories (merge ae/maven-central {"clojars" "https://clojars.org/repo"})
              :modify-session add-no-ranges-transformer)
ExceptionInfo [net.cgrand/regex "1.1.0"] -> [org.clojure/clojure "[1.2.0,)"] version range bad!!  clojure.core/ex-info (core.clj:4227)

tester.core> (ae/resolve-dependencies
              :coordinates '[[org.clojure/clojure "[1.4.0]"]]
              :repositories (merge ae/maven-central {"clojars" "https://clojars.org/repo"})
              :modify-session add-no-ranges-transformer)
ExceptionInfo [org.clojure/clojure "[1.4.0,1.4.0]"] version range bad!!  clojure.core/ex-info (core.clj:4227)

Pomegranate disregards order in Aether dependency APIs

I’m sorry to report that I believe there is a flaw in
Pomegranate/Aether’s dependency resolution functionality.

In Maven, a fundamental property of dependency trees is that they are
ordered (occurrence order). The most obvious place where dependency
order is significant is in the construction of classpaths.

The data structures returned by Pomegranate from Aether API calls are
inherently unordered (maps and sets), thus losing the order property
– even though the Aether API itself uses ordered collections.

An example: I tried the add-dependencies example from the README with
[ring/ring-core "1.0.0"]:

{[ring/ring-core "1.0.0"]
 #{[org.clojure/clojure "1.2.1"]
   [commons-codec "1.4"]
   [javax.servlet/servlet-api "2.5"]
   [commons-io "1.4"]
   [commons-fileupload "1.2.1"]},
 [org.clojure/clojure "1.2.1"] nil,
 [commons-codec "1.4"] nil,
 [commons-io "1.4"] nil,
 [commons-fileupload "1.2.1"] nil,
 [javax.servlet/servlet-api "2.5"] nil}

The map entries appear in the correct order because the map is small,
the set elements appear out of order. add-dependencies should rather
return something like the following, or perhaps use third-party ordered
maps or sets. (This is not very pretty …)

[[[ring/ring-core "1.0.0"]
  [org.clojure/clojure "1.2.1"]
  [commons-codec "1.4"]
  [commons-io "1.4"]
  [commons-fileupload "1.2.1"]
  [javax.servlet/servlet-api "2.5"]]
 [org.clojure/clojure "1.2.1"]
 [commons-codec "1.4"]
 [commons-io "1.4"]
 [commons-fileupload "1.2.1"]
 [javax.servlet/servlet-api "2.5"]]

I stumbled on this when I looked into technomancy/leiningen#2283 very
briefly this afternoon. If this is just a misunderstanding on my part,
my apologies. Thank you.

Add support for "managed" dependencies in `resolve-dependencies`

In Maven, a parent pom can specify a section called dependencyManagement. If this is specified, the versions of the dependencies listed in this section are used when resolving transitive dependencies. It also allows you to specify dependencies in the main sections of the pom w/o specifying a version number for them.

Exposing this functionality through the pomegranate API would be useful for writing leiningen plugins. In Aether, managedDependencies is exposed as an optional argument to the constructor for a CollectRequest. pomegranate's resolve-dependencies* is already using this constructor, so adding this support would be as simple as adding support for another optional argument, and using it to populate the argument to the CollectRequest constructor with this value instead of hard-coding it to nil.

Install sources and javadoc along with main artifact

Hi!

This is more of a question than an issue. I have one main artifact and I would like to build -sources and -javadoc along with it.

I am using boot, and the output I get seems promising:

Installing rest-resources-viz-0.1.0-javadoc.jar...
Jarpath /home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0-javadoc.jar Pompath com.elasticpath/rest-resources-viz
Artifact-map {[com.elasticpath/rest-resources-viz "0.1.0" :extension "jar" :classifier nil] "/home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0-javadoc.jar"}
Installing rest-resources-viz-0.1.0.jar...
Jarpath /home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0.jar Pompath com.elasticpath/rest-resources-viz
Artifact-map {[com.elasticpath/rest-resources-viz "0.1.0" :extension "jar" :classifier nil] "/home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0.jar"}
Installing rest-resources-viz-0.1.0-sources.jar...
Jarpath /home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0-sources.jar Pompath com.elasticpath/rest-resources-viz
Artifact-map {[com.elasticpath/rest-resources-viz "0.1.0" :extension "jar" :classifier nil] "/home/arichiardi/.boot/cache/tmp/home/arichiardi/git/rest-resources-viz/bxm/-bfwudo/rest-resources-viz-0.1.0-sources.jar"}

But then what I see in .m2 is only one .jar file that has the size of the last (the -sources) artifact listed above.

I am also checking the code along with this, but I was wondering if I am missing something or if it is something pomegranade does not handle at the moment.

Add support for http proxy

Hi

I have been trying to get leiningen with swank working behind a proxy - it fails on that downloading plugins when there is a proxy doesn't work. As I figure it is because pomegranate/aether does not care about any http_proxy or other proxy settings.

So what I would like to see is adding something like this in aether.clj

add imports:
(org.sonatype.aether.util.repository DefaultProxySelector)
(org.sonatype.aether.repository Proxy)

In (defn- repository-session add spmething like:

(.setProxySelector (doto (new DefaultProxySelector)
                     (.add
                       ( org.sonatype.aether.repository.Proxy.
                         "http"
                         ;;(System/getProperty "http.proxyHost")
                         "196.38.43.185" ;; from http://tools.rosinstrument.com/cgi-bin/sps.pl?bp=&pattern=&max=100&nskip=0&file=anonlog.csv
                         ;;(System/getProperty "http.proxyPort")
                         80
                         nil)
                       nil
                     )                           

Some conditional use of the proxy whether it is defined or not should perhaps be used?

As I haven't programmed in Clojure (yet) this example might of course be wrong.

BR

Daniel

Expose offline mode

Would be nice to be able to get back a seq of files without hitting the network.

Provide an error if a registered wagon factory fails to instantiate

When a wagon factory is registered with register-wagon-factory!, and the supplied function fails, then the failure is silently ignored, and a NoRepositoryConnectorException exception is thrown with a "No connector available to access repository..." message. This message is misleading.

This could be implemented something like this:

(deftype PomegranateWagonProvider []
  WagonProvider
  (release [_ wagon])
  (lookup [_ role-hint]
    (when-let [f (get @wagon-factories role-hint)]
      (try 
        (f)
        (catch Exception e
          (clojure.stacktrace/print-cause-trace e))))))

If just printing the exception is acceptable, I can create a pull request.

resolve-dependencies returns exclusions as vector of vectors

Not sure if this is a bug or intentional. Via boot-clj/boot#635

(require 'cemerick.pomegranate.aether)

(cemerick.pomegranate.aether/resolve-dependencies
 :coordinates  '[[boot/core "2.7.0" :exclusions [org.clojure/clojure boot/pod]]]
 :repositories  [["clojars" {:url "https://repo.clojars.org/"}]
                 ["maven-central" {:url "https://repo1.maven.org/maven2"}]])

;; returns this:
{[boot/core "2.7.0" :exclusions [[org.clojure/clojure] [boot/pod]]] nil}

I would expect it to return exclusions in the same way they were given to resolve-dependencies, i.e. in this case the expected return value would be:

{[boot/core "2.7.0" :exclusions [org.clojure/clojure boot/pod]] nil}

Is this a bug or is there purpose to returning exclusions as vector of vectors? Thanks! :)

PS. I also reproduced this with v1.0.0.

Support retrieval of single artifacts for e.g. sources + javadoc

For IDEs, it's really important to be able to have pomegranate grab, in addition to the main artifact, derived artifacts (via classifiers) containing source files, or javadocs. This will enable those IDEs to provide important features such as 'go to definition', 'documentation hover', when the main artifact does not contain the sources or the doc.

Hopefully, this could be made generic in the pomegranade interface: either use it as currently, or add an additional parameter consisting of a set of additional classifiers to try to grab (if the classifiers do not exist, this should not be a failure)

unnamed windows path issue on deploy

(aether/deploy 
  :coordinates [nomnomnom/nomnomnom "0.5.0-SNAPSHOT"] 
  :artifact-map {
          [:extension "jar"] "s:\\workspace.eclipse.2k13_2\\leiningen\\test_projects\\sample\\target\\provided\\nomnomnom-0.5.0-SNAPSHOT.jar", 
          [:extension "pom"] "s:\\workspace.eclipse.2k13_2\\leiningen\\test_projects\\sample\\pom.xml"
   } 
:transfer-listener 
 :stdout 
:repository [
  ["file://C:\\Users\\user\\AppData\\Local\\Temp\\lein-custom-repo" 
   {:url "file://C:\\Users\\user\\AppData\\Local\\Temp\\lein-custom-repo"}]
 ]
)

if I call that, I get approximately this:

Could not find metadata nomnomnom:nomnomnom:0.5.0-SNAPSHOT/maven-metadata.xml in file://C:\Users\use
r\AppData\Local\Temp\lein-custom-repo (file://C:\Users\user\AppData\Local\Temp\lein-custom-repo)
org.sonatype.aether.deployment.DeploymentException: Failed to update metadata nomnomnom:nomnomnom:0.
5.0-SNAPSHOT/maven-metadata.xml: Could not write metadata C:\Users\user\.m2\repository\nomnomnom\nom
nomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml: C:
\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\user\App
Data\Local\Temp\lein-custom-repo.xml (The filename, directory name, or volume label syntax is incorr
ect)
        at org.sonatype.aether.impl.internal.DefaultDeployer.upload(DefaultDeployer.java:414)
        at org.sonatype.aether.impl.internal.DefaultDeployer.deploy(DefaultDeployer.java:256)
        at org.sonatype.aether.impl.internal.DefaultDeployer.deploy(DefaultDeployer.java:211)
        at org.sonatype.aether.impl.internal.DefaultRepositorySystem.deploy(DefaultRepositorySystem.
java:443)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
        at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
        at cemerick.pomegranate.aether$deploy_artifacts.doInvoke(aether.clj:328)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:617)
        at cemerick.pomegranate.aether$deploy.doInvoke(aether.clj:401)
        at clojure.lang.RestFn.invoke(RestFn.java:619)
        at leiningen.deploy$deploy.invoke(deploy.clj:161)
        at leiningen.test.deploy$deploy_snapshots.doInvoke(deploy.clj:25)
        at clojure.lang.RestFn.invoke(RestFn.java:442)
        at leiningen.test.deploy$fn__3526.invoke(deploy.clj:43)
        at clojure.test$test_var$fn__7145.invoke(test.clj:701)
        at clojure.test$test_var.invoke(test.clj:701)
        at user$eval2606$test_var_with_selector__2615.invoke(NO_SOURCE_FILE:0)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.injected$compose_hooks$fn__2540.doInvoke(NO_SOURCE_FILE)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:617)
        at leiningen.core.injected$run_hooks.invoke(NO_SOURCE_FILE:0)
        at leiningen.core.injected$prepare_for_hooks$fn__2545$fn__2546.doInvoke(NO_SOURCE_FILE:0)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.test$test_all_vars$fn__7149$fn__7156.invoke(test.clj:717)
        at clojure.test$default_fixture.invoke(test.clj:671)
        at clojure.test$test_all_vars$fn__7149.invoke(test.clj:717)
        at clojure.test$default_fixture.invoke(test.clj:671)
        at clojure.test$test_all_vars.invoke(test.clj:713)
        at clojure.test$test_ns.invoke(test.clj:736)
        at clojure.core$map$fn__4207.invoke(core.clj:2487)
        at clojure.lang.LazySeq.sval(LazySeq.java:42)
        at clojure.lang.LazySeq.seq(LazySeq.java:60)
        at clojure.lang.Cons.next(Cons.java:39)
        at clojure.lang.RT.boundedLength(RT.java:1654)
        at clojure.lang.RestFn.applyTo(RestFn.java:130)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.test$run_tests.doInvoke(test.clj:751)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:617)
        at user$eval2606$fn__2672.invoke(NO_SOURCE_FILE)
        at user$eval2606.invoke(NO_SOURCE_FILE:0)
        at clojure.lang.Compiler.eval(Compiler.java:6619)
        at clojure.lang.Compiler.eval(Compiler.java:6609)
        at clojure.lang.Compiler.eval(Compiler.java:6582)
        at clojure.core$eval.invoke(core.clj:2852)
        at leiningen.core.eval$eval2244$fn__2245.invoke(eval.clj:273)
        at clojure.lang.MultiFn.invoke(MultiFn.java:231)
        at leiningen.core.eval$eval_in_project.invoke(eval.clj:282)
        at leiningen.test$test.doInvoke(test.clj:177)
        at clojure.lang.RestFn.invoke(RestFn.java:423)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$resolve_task$fn__1944.doInvoke(main.clj:149)
        at clojure.lang.RestFn.applyTo(RestFn.java:139)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$apply_task.invoke(main.clj:189)
        at leiningen.core.main$resolve_and_apply.invoke(main.clj:193)
        at leiningen.core.main$_main$fn__2007.invoke(main.clj:257)
        at leiningen.core.main$_main.doInvoke(main.clj:247)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:617)
        at clojure.main$main_opt.invoke(main.clj:335)
        at clojure.main$main.doInvoke(main.clj:440)
        at clojure.lang.RestFn.invoke(RestFn.java:457)
        at clojure.lang.Var.invoke(Var.java:427)
        at clojure.lang.AFn.applyToHelper(AFn.java:172)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)
Caused by: org.sonatype.aether.RepositoryException: Could not write metadata C:\Users\user\.m2\repos
itory\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-
custom-repo.xml: C:\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file
:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml (The filename, directory name, or volume lab
el syntax is incorrect)
        at org.apache.maven.repository.internal.MavenMetadata.write(MavenMetadata.java:125)
        at org.apache.maven.repository.internal.MavenMetadata.merge(MavenMetadata.java:73)
        at org.sonatype.aether.impl.internal.DefaultDeployer.upload(DefaultDeployer.java:410)
        ... 84 more
Caused by: java.io.FileNotFoundException: C:\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0-SNA
PSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml (The filename, dire
ctory name, or volume label syntax is incorrect)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
        at org.codehaus.plexus.util.xml.XmlStreamWriter.<init>(XmlStreamWriter.java:59)
        at org.codehaus.plexus.util.WriterFactory.newXmlWriter(WriterFactory.java:117)
        at org.apache.maven.repository.internal.MavenMetadata.write(MavenMetadata.java:120)
        ... 86 more
Failed to update metadata nomnomnom:nomnomnom:0.5.0-SNAPSHOT/maven-metadata.xml: Could not write met
adata C:\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\
user\AppData\Local\Temp\lein-custom-repo.xml: C:\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0
-SNAPSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml (The filename,
directory name, or volume label syntax is incorrect)

lein test :only leiningen.test.deploy/test-deploy-custom-url

ERROR in (test-deploy-custom-url) (core.clj:4327)
Uncaught exception, not in assertion.
expected: nil
  actual: clojure.lang.ExceptionInfo: Suppressed exit
 at clojure.core$ex_info.invoke (core.clj:4327)
    leiningen.core.main$exit.invoke (main.clj:74)
    leiningen.core.main$abort.doInvoke (main.clj:84)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.deploy$deploy.invoke (deploy.clj:167)
    leiningen.test.deploy$deploy_snapshots.doInvoke (deploy.clj:25)
    clojure.lang.RestFn.invoke (RestFn.java:442)
    leiningen.test.deploy/fn (deploy.clj:43)
    clojure.test$test_var$fn__7145.invoke (test.clj:701)
    clojure.test$test_var.invoke (test.clj:701)
    user$eval2606$test_var_with_selector__2615.invoke (NO_SOURCE_FILE:0)
    clojure.lang.AFn.applyToHelper (AFn.java:163)
    clojure.lang.AFn.applyTo (AFn.java:151)
    clojure.core$apply.invoke (core.clj:619)
    leiningen.core.injected$compose_hooks$fn__2540.doInvoke (NO_SOURCE_FILE:-1)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:617)
    leiningen.core.injected$run_hooks.invoke (NO_SOURCE_FILE:0)
    leiningen.core.injected$prepare_for_hooks$fn__2545$fn__2546.doInvoke (NO_SOURCE_FILE:0)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.test$test_all_vars$fn__7149$fn__7156.invoke (test.clj:717)
    clojure.test$default_fixture.invoke (test.clj:671)
    clojure.test$test_all_vars$fn__7149.invoke (test.clj:717)
    clojure.test$default_fixture.invoke (test.clj:671)
    clojure.test$test_all_vars.invoke (test.clj:713)
    clojure.test$test_ns.invoke (test.clj:736)
    clojure.core$map$fn__4207.invoke (core.clj:2487)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:60)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1654)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invoke (core.clj:619)
    clojure.test$run_tests.doInvoke (test.clj:751)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:617)
    user$eval2606$fn__2672.invoke (NO_SOURCE_FILE:-1)
    user$eval2606.invoke (NO_SOURCE_FILE:0)
    clojure.lang.Compiler.eval (Compiler.java:6619)
    clojure.lang.Compiler.eval (Compiler.java:6609)
    clojure.lang.Compiler.eval (Compiler.java:6582)
    clojure.core$eval.invoke (core.clj:2852)
    leiningen.core.eval$eval2244$fn__2245.invoke (eval.clj:273)
    clojure.lang.MultiFn.invoke (MultiFn.java:231)
    leiningen.core.eval$eval_in_project.invoke (eval.clj:282)
    leiningen.test$test.doInvoke (test.clj:177)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    clojure.lang.Var.invoke (Var.java:419)
    clojure.lang.AFn.applyToHelper (AFn.java:163)
    clojure.lang.Var.applyTo (Var.java:532)
    clojure.core$apply.invoke (core.clj:619)
    leiningen.core.main$resolve_task$fn__1944.doInvoke (main.clj:149)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:619)
    leiningen.core.main$apply_task.invoke (main.clj:189)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:193)
    leiningen.core.main$_main$fn__2007.invoke (main.clj:257)
    leiningen.core.main$_main.doInvoke (main.clj:247)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:419)
    clojure.lang.AFn.applyToHelper (AFn.java:163)
    clojure.lang.Var.applyTo (Var.java:532)
    clojure.core$apply.invoke (core.clj:617)
    clojure.main$main_opt.invoke (main.clj:335)
    clojure.main$main.doInvoke (main.clj:440)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:427)
    clojure.lang.AFn.applyToHelper (AFn.java:172)
    clojure.lang.Var.applyTo (Var.java:532)
    clojure.main.main (main.java:37)

Ran 4 tests containing 12 assertions.
0 failures, 1 errors.
Tests failed.
clojure.lang.ExceptionInfo: Suppressed exit {:exit-code 1}
        at clojure.core$ex_info.invoke(core.clj:4327)
        at leiningen.core.main$exit.invoke(main.clj:74)
        at leiningen.core.main$abort.doInvoke(main.clj:84)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at leiningen.test$test.doInvoke(test.clj:182)
        at clojure.lang.RestFn.invoke(RestFn.java:423)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$resolve_task$fn__1944.doInvoke(main.clj:149)
        at clojure.lang.RestFn.applyTo(RestFn.java:139)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$apply_task.invoke(main.clj:189)
        at leiningen.core.main$resolve_and_apply.invoke(main.clj:193)
        at leiningen.core.main$_main$fn__2007.invoke(main.clj:257)
        at leiningen.core.main$_main.doInvoke(main.clj:247)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:617)
        at clojure.main$main_opt.invoke(main.clj:335)
        at clojure.main$main.doInvoke(main.clj:440)
        at clojure.lang.RestFn.invoke(RestFn.java:457)
        at clojure.lang.Var.invoke(Var.java:427)
        at clojure.lang.AFn.applyToHelper(AFn.java:172)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)

so the problem is that somehow it gets a filename like this:
C:\Users\user\.m2\repository\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml
C:\Users\user.m2\repository\nomnomnom\nomnomnom\0.5.0-SNAPSHOT\maven-metadata-file:\C:\Users\user\AppData\Local\Temp\lein-custom-repo.xml

am I doing something wrong here? I know it works fine with unix paths but windows ...?!

EDIT: to note that I've also tried these params to aether/deploy:

:coordinates [nomnomnom/nomnomnom "0.5.0-SNAPSHOT"]
 :artifact-map {[:extension "jar"] "s:\\workspace.eclipse.2k13_2\\leiningen\\test_projects\\sample\\target\\provided\\nomnomnom-0.5.0-SNAPSHOT.jar", 
 [:extension "pom"] "s:\\workspace.eclipse.2k13_2\\leiningen\\test_projects\\sample\\pom.xml"} 
:transfer-listener 
:stdout 
:repository [
  ["file://C:/Users/user/AppData/Local/Temp/lein-custom-repo" 
  {:url "file://C:/Users/user/AppData/Local/Temp/lein-custom-repo"}]
]

notice the "" became "/" in the :repository part

and also with all the "" as "/" such as: (trying now)

 :coordinates [nomnomnom/nomnomnom "0.5.0-SNAPSHOT"] 
:artifact-map {[:extension "jar"] "s:/workspace.eclipse.2k13_2/leiningen/test_projects/sample/target/provided/nomnomnom-0.5.0-SNAPSHOT.jar", 
[:extension "pom"] "s:/workspace.eclipse.2k13_2/leiningen/test_projects/sample/pom.xml"} 
:transfer-listener 
:stdout 
:repository [
  ["file://C:/Users/user/AppData/Local/Temp/lein-custom-repo" 
  {:url "file://C:/Users/user/AppData/Local/Temp/lein-custom-repo"}]]

Any ideas on this? is it expecting only unix paths? so like no drive letter? and maybe delimiters to be "/" also ?

Check System Env for M2_HOME to reset the local-repo

Hi, Cemerick,

I am using leiningen and want to use a local repo, one option is to write a local-repo in project.clj, this is OK but not very clean when you want to force all your projects to a local repo.

I did some research, and found we can add a small change in pomegranate to achieve the goal. We can just check the local system env for M2_HOME, and use it as the default maven local repo.

Could you consider this option?

Thanks a lot!

Use of 'artifact' in resolve-artifact*

What's up with the use of (artifact %) in lines 579 and 580 (and possibly 585 too)? It looks like the code expects it to return something like a Dependency (calls to .getArtifact/.setArtifact) but the definition is:

(defn- artifact
  [[group-artifact version & {:keys [scope optional exclusions]} :as dep-spec]]
  (DefaultArtifact. (coordinate-string dep-spec)))

Am I missing something? Looks like a bug to me...

Adding dependencies outside a REPL does not work

I am trying to use pomegranate to add some deps to a running system. This works fine in the repl but if I try to do this in a jar I get

Could not find a suitable classloader to modify from clojure.lang.LazySeq@385266a9

Perhaps I am running into this
From Readme,

If you are in a situation where you are using pomegranate but do not have a clojure.lang.DynamicClassLoader visible in your classloader hierarchy, you will need to explicitly enable the java.net.URLClassLoader support in dynapath (upon which pomegranate relies for such things).

If so, how do I enable URLClassLoader support in dynapath ?

Eliminate install/deploy distinction?

Is there any reason to treat installs any differently than a deploy to a local repository? The aether APIs are remarkably similar, and AFAIK, an install is a deploy to a local repository, definitionally. (To the point where I've uploaded local repos to a server, and used them a remote repos without a problem.)

Concretely, I'd like to see the install and deploy fns go away, replaced by distribute perhaps. Then, it's up to the caller to provide the target :repository (just as they must when using deploy today).

Support mirrors that require authentication

gh-34 and gh-36 added basic support for mirrors. However, repositories provided by DefaultMirrorSelector never carry credentials, and so mirrors that require authentication will not work yet.

Aether has an AuthenticationSelector interface, which can be set on the system session to provide credentials for repositories generally; this seems tailor-made to support having a credentials store (such as settings.xml), and looks to be how aether adds credentials to the "bare" repositories that can be produced by a MirrorSelector.

This approach wouldn't mesh well with pomegranate; repositories are specified along with their credentials, and it seems like mirrors should be, too. My thought is to not use DefaultMirrorSelector at all, and instead provide a MirrorSelector implementation that returns repositories with credentials already set (using the same schema for :mirrors credentials as are currently used for :repositories credentials). This should eliminate the need for an AuthenticationSelector entirely, and allow us to carry on in our preferred way of providing credentials.

The one wrinkle is that the repository/mirror matching methods are private in DefaultMirrorSelector. I think it won't be too difficult to either wall-hack them, or use a dummy DefaultMirrorSelector to drive our own MirrorSelector's matching of repositories to mirrors.

(One idea might be to ditch the brain-dead matching mini-language that aether and maven specify. We have a lot of options that are a lot more powerful than what DefaultMirrorSelector implements. Insofar as pomegranate is ostensibly a wrapper for Aether, I don't know if this is a good or bad idea.)

Feedback definitely wanted before I head down the rabbit hole.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.