Giter Site home page Giter Site logo

seancorfield / depstar Goto Github PK

View Code? Open in Web Editor NEW

This project forked from healthfinch/depstar

239.0 4.0 19.0 779 KB

Builds JARs, uberjars, does AOT, manifest generation, etc for deps.edn projects

Home Page: https://cljdoc.org/d/com.github.seancorfield/depstar/CURRENT

HTML 17.69% Clojure 82.23% Dockerfile 0.08%

depstar's Introduction

Use tools.build

depstar came into existence, in March 2018, because there was no "built-in" way to create library JAR files with the Clojure CLI and deps.edn at the time. Over the three and a half years since then, depstar has added a lot of functionality with the ability to make uberjars, perform AOT compilation, generate a JAR file manifest, and so on. My intent, as maintainer of depstar since October 2018, has always been to provide an easy-to-use JAR builder as long as there was no "official" solution for that.

In early July, 2021, the Clojure core team announced tools.build as an "official" solution for building JAR files and performing AOT compilation. In addition, tools.build was a toolkit that provided functions to copy files, directories, compile Java code, and run shell processes -- things that depstar had never been intended for.

For a while, there was a functionality gap between the uber task of tools.build and the uberjar functionality of depstar. I've been working with Alex Miller to reduce that gap and with the release of v0.4.0 on September 15, parity was achieved. I had already switched most of my open source projects over to tools.build for running tests and building the JAR files and with that latest release I was able to switch the build.clj script at work over to tools.build for building our production uberjar artifacts! The missing piece (for us at work) had been the merging of the Log4j2Plugins.dat files across libraries which depstar had supported since December 2020 (version 2.0.160) and that is now possible through the :conflict-handlers option added to uber in v0.4.0 of tools.build, along with my log4j2 conflict handler library.

At this point, depstar is no longer needed and only serves to fragment the tooling around the Clojure CLI and deps.edn so I am sunsetting this library and asking everyone to switch to tools.build instead. You can reduce the amount of "boilerplate" in your build.clj by using my build-clj library which has equivalent tasks for clean, jar, and uber with "sane defaults" for most options and combines the functionality described in the official tools.build guide. In addition, it has tasks to run your tests and deploy your library JAR to Clojars. It's uber task provides the log4j2 plugins cache merging functionality by default.

Thank you for all the support and feedback on depstar over the last three years!

Please use tools.build and build your projects responsibility!

depstar Clojure CI Open in Gitpod

Builds JARs, uberjars, does AOT, manifest generation, etc for deps.edn projects (forked from healthfinch/depstar and enhanced).

TL;DR

The latest versions on Clojars and on cljdoc:

Clojars Project cljdoc badge

The documentation on cljdoc.org is for the current version of depstar:

The documentation on GitHub is for develop since the 2.1.303 release -- see the CHANGELOG and then read the corresponding updated documentation on GitHub if you want.

This project follows the version scheme MAJOR.MINOR.COMMITS where MAJOR and MINOR provide some relative indication of the size of the change, but do not follow semantic versioning. In general, all changes endeavor to be non-breaking (by moving to new names rather than by breaking existing names). COMMITS is an ever-increasing counter of commits since the beginning of this repository.

Basic Usage

Add depstar via one or more aliases in your project deps.edn or user-level deps.edn (in ~/.clojure/ or ~/.config/clojure/):

{
 :aliases {
  ;; build an uberjar (application) with AOT compilation by default:
  :uberjar {:replace-deps {com.github.seancorfield/depstar {:mvn/version "2.1.303"}}
            :exec-fn hf.depstar/uberjar
            :exec-args {:aot true}}
  ;; build a jar (library):
  :jar {:replace-deps {com.github.seancorfield/depstar {:mvn/version "2.1.303"}}
        :exec-fn hf.depstar/jar
        :exec-args {}}
 }
}

Create an (application) uberjar by invoking depstar with the desired jar name:

clojure -X:uberjar :jar MyProject.jar

An uberjar created by that command can be run as follows:

java -cp MyProject.jar clojure.main -m project.core

Create a (library) jar by invoking depstar with the desired jar name:

clojure -X:jar :jar MyLib.jar

For more detail, read Getting Started and the applicable sections of the documentation.

License

The use and distribution terms for this software are covered by the Eclipse Public License 2.0

depstar's People

Contributors

borkdude avatar devn avatar eval avatar ghadishayban avatar jarohen avatar noisesmith avatar quephird avatar quezion avatar seancorfield avatar stathissideris avatar sundbp avatar wandersoncferreira 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

depstar's Issues

Unable to copy file error since 1.1.126

After upgrading from 1.1.117 to 1.1.126 the following error is being thrown for multiple deps when executing uberjar.

{:error "unable to copy file", :name "META-INF/LICENSE.txt", :exception java.nio.charset.MalformedInputException, :message "Input length = 1"}

Accordingly the process completes with errors.

depstar uses clojure.xml which will break on future JDKs

On JDK 11 this already gives illegal reflective access warnings.

Since all we need is to extract the (first) group ID, artifact ID, and version tags, we could probably use slurp and re-find (and make sure we find the first ones!).

Concoct some automated testing

Given the wider usage of depstar now and the number of small bugs that have crept into releases, it's probably a good point to figure out a way to run automated tests against it.

Failing to include web assets using uberjar

When attempting to include webassets in an uberjar, depstar is refusing to add:
clj -A:depstar:webassets -m hf.depstar.uberjar app.jar

Building uber jar: app.jar
Exception in thread "main" java.io.IOException: Is a directory
	at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
	at sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:46)
	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
	at sun.nio.ch.IOUtil.read(IOUtil.java:197)
	at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:159)
	at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
	at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
	at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
	at java.io.InputStream.read(InputStream.java:101)
	at java.nio.file.Files.copy(Files.java:2908)
	at java.nio.file.Files.copy(Files.java:3027)
	at hf.depstar.uberjar$copy_BANG_.invokeStatic(uberjar.clj:117)
	at hf.depstar.uberjar$copy_BANG_.invoke(uberjar.clj:110)
	at hf.depstar.uberjar$copy_directory$reify__210$fn__211.invoke(uberjar.clj:185)
	at hf.depstar.uberjar$copy_directory$reify__210.visitFile(uberjar.clj:184)
	at java.nio.file.Files.walkFileTree(Files.java:2670)
	at java.nio.file.Files.walkFileTree(Files.java:2742)
	at hf.depstar.uberjar$copy_directory.invokeStatic(uberjar.clj:194)
	at hf.depstar.uberjar$copy_directory.invoke(uberjar.clj:176)
	at hf.depstar.uberjar$eval215$fn__216.invoke(uberjar.clj:201)
	at clojure.lang.MultiFn.invoke(MultiFn.java:238)
	at hf.depstar.uberjar$copy_source.invokeStatic(uberjar.clj:217)
	at hf.depstar.uberjar$copy_source.invoke(uberjar.clj:215)
	at hf.depstar.uberjar$run$fn__243$fn__244.invoke(uberjar.clj:312)
	at clojure.core$run_BANG_$fn__8431.invoke(core.clj:7635)
	at clojure.lang.PersistentVector.reduce(PersistentVector.java:341)
	at clojure.core$reduce.invokeStatic(core.clj:6747)
	at clojure.core$run_BANG_.invokeStatic(core.clj:7630)
	at clojure.core$run_BANG_.invoke(core.clj:7630)
	at hf.depstar.uberjar$run$fn__243.invoke(uberjar.clj:312)
	at hf.depstar.uberjar$run.invokeStatic(uberjar.clj:306)
	at hf.depstar.uberjar$run.invoke(uberjar.clj:293)
	at hf.depstar.uberjar$uber_main.invokeStatic(uberjar.clj:332)
	at hf.depstar.uberjar$uber_main.invoke(uberjar.clj:325)
	at hf.depstar.uberjar$_main.invokeStatic(uberjar.clj:336)
	at hf.depstar.uberjar$_main.doInvoke(uberjar.clj:334)
	at clojure.lang.RestFn.invoke(RestFn.java:410)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.RestFn.applyTo(RestFn.java:132)
	at clojure.lang.Var.applyTo(Var.java:702)
	at clojure.core$apply.invokeStatic(core.clj:657)
	at clojure.main$main_opt.invokeStatic(main.clj:317)
	at clojure.main$main_opt.invoke(main.clj:313)
	at clojure.main$main.invokeStatic(main.clj:424)
	at clojure.main$main.doInvoke(main.clj:387)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:702)
	at clojure.main.main(main.java:37)

My working tree contains a "resources" folder, which I've removed from :paths at the top-level and added to a webassets alias as per the depstar github README.

Removing the :webassts alias from the command line produces app.jar (without the resources folder included, obviously!).

depstar included in deps.edn (attempted with both 0.3.3 and RELEASE versions, with same results):

:depstar {:extra-deps {seancorfield/depstar {:mvn/version "RELEASE"}}}

Versions:
clojure 1.9
CLI tools: 1.10.1.469
Ubuntu Linux 18.04
zsh 5.4.2

Allow the target jar file to be specified in any order

I would like an alias like:

  :uberjar {:extra-deps {seancorfield/depstar {:mvn/version "1.0.97"}}
            :main-opts ["-m" "hf.depstar.uberjar" "-C" "-m" "myapp.core"]}

So the user simply has to run

clojure -A:uberjar myappUberJar.jar

To create an Uberjar.

Currently this is not working because the -C and -m option must
be placed after the jar filename.

2.0: support multiple compilation namespaces

By default, the compilation should be of [main-class] but it should be possible to override that with a vector of namespaces to compile.

Bonus points for implementing :all as a shortcut, like Leiningen, for compiling all namespaces in the project.

Provided dependencies

I have a :scope "provided" dependency that's still being included in the uber jar, it looks like this is ignored?

Is there a way to suppress warnings?

I'm getting "clashing jar item" warnings when building an uberjar that I don't have the ability to fix. I'd like to suppress the warnings, but I don't think I can because they are printed via prn. Would it be possible to use clojure.logging instead? I'd be happy to submit a PR if so.

add regex exclude on jar assembly

when building a jar with namespaces aot compiled:

$ clj -e "(compile 'yang.java)"; clj -A:jar

it does work, but also brings these along:

     0 Mon Aug 24 18:45:40 EDT 2020 clojure/core/
     0 Mon Aug 24 18:45:40 EDT 2020 clojure/core/specs/
   932 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__40.class
  1178 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__65$fn__71.class
   798 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__46.class
   929 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__27.class
   936 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__101.class
   929 Mon Aug 24 18:45:39 EDT 2020 clojure/core/specs/alpha$fn__25.class
   ...

this is due to the fact that "Clojure core uses specs for language features (as macros), so those get dragged in".

currently the only way not to have them in the jar is to manually remove them after the jar is built.

would be great to have a regex exclude option on jar assembly.

Read pom.xml, create manifest, and add it to the JAR

If pom.xml exists locally, read it to get the version, group ID, and artifact ID, and build a minimal manifest in the JAR file, also copy the pom.xml file to META-INF/maven/{group}/{artifact}/pom.xml inside the JAR file.

Use clojure.xml to parse the POM so we don't drag in any new dependencies.

1.6 -> 2.1 causes "java.lang.ClassNotFoundException: clojure.main"

Hi Sean,

thanks for maintaining yet another important Clojure library.

Just writing that when going from 1.6 to 2.1 I saw this error:

Jun 27 14:01:07 ubuntu java[9649]: Error: Could not find or load main class clojure.main
Jun 27 14:01:07 ubuntu java[9649]: Caused by: java.lang.ClassNotFoundException: clojure.main

I did an emergency rollback to 1.6 and the resulting jar works again.

I didn't have time to diagnose, but I'm opening this issue just so that I don't forget to come back to it.

The output when building with 2.1 was:

Downloading: seancorfield/depstar/0.2.1/depstar-0.2.1.pom from https://repo.clojars.org/
Downloading: seancorfield/depstar/0.2.1/depstar-0.2.1.jar from https://repo.clojars.org/
Building uber jar: gamma-dist/gamma-fd1ccf13ba33ce1b86e0f67a2874dfcbcc8e3fcc.jar
{:warning "clashing jar item", :path ".DS_Store", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/com.fasterxml.jackson.core.JsonFactory", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/Location.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/ReferenceResolver.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLEvent.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLInputStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLName.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLStreamException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/utils/NestedThrowable$Util.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/utils/NestedThrowable.class", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/javax.servlet.ServletContainerInitializer", :strategy :concat-lines}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRFileStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRInputStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AbstractPredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ActionTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AmbiguityInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ArrayPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATN.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$AbstractConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$ConfigEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$ConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializationOptions.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSerializer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNType.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AtomTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BasicBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BasicState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BlockEndState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ContextSensitivityInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionEventInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/EmptyPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/EpsilonTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ErrorInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerActionExecutor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerActionType.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNConfig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNSimulator$SimState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerChannelAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerCustomAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerIndexedCustomAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerMoreAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerPopModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerPushModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerSkipAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerTypeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LL1Analyzer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LookaheadEventInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LoopEndState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/NotSetTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/OrderedATNConfigSet$LexerConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/OrderedATNConfigSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ParseInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ParserATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PlusBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PlusLoopbackState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PrecedencePredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredicateEvalInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContext$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContextCache.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode$AltAndContextConfigEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode$AltAndContextMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ProfilingATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RangeTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleStopState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$AND.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$Operator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$OR.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$PrecedencePredicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$Predicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SetTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SingletonPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarLoopbackState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarLoopEntryState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/TokensStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/Transition$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/Transition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/WildcardTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BailErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BaseErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BufferedTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CharStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonTokenFactory.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ConsoleErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/DefaultErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFA$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFA.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFASerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFAState$PredPrediction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFAState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/LexerDFASerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/DiagnosticErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/FailedPredicateException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/InputMismatchException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/InterpreterRuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/IntStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Lexer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/LexerInterpreter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/LexerNoViableAltException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ListTokenSource.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/AbstractEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Array2DHashSet$SetIterator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Array2DHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/DoubleKeyMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/EqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/FlexibleHashMap$Entry.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/FlexibleHashMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntegerList.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntegerStack.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Interval.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntervalSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/LogManager$Record.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/LogManager.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/MultiMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/MurmurHash.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/NotNull.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/ObjectEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/OrderedHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Pair.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/ParseCancellationException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Predicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/TestRig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Triple.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Utils.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/NoViableAltException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser$TraceListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser$TrimToSizeListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ParserInterpreter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ParserRuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ProxyErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RecognitionException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Recognizer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Recognizer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuleContextWithAltNum.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuntimeMetaData.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Token.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenFactory.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenSource.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$InsertBeforeOp.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$ReplaceOp.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$RewriteOperation.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/AbstractParseTreeVisitor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ErrorNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ErrorNodeImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeProperty.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeVisitor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeWalker.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/Chunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePattern.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher$CannotInvokeStartRule.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher$StartRuleDoesNotConsumeFullPattern.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/RuleTagToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TagChunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TextChunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TokenTagToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/RuleNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/SyntaxTree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/TerminalNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/TerminalNodeImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/Tree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/Trees.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPath$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPath.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathLexer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathLexerErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathRuleAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathRuleElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathTokenAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathTokenElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathWildcardAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathWildcardElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/UnbufferedCharStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/UnbufferedTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Vocabulary.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/VocabularyImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/WritableToken.class", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/maven/org.antlr/antlr4-runtime/pom.xml", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/maven/org.antlr/antlr4-runtime/pom.properties", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/com.fasterxml.jackson.core.JsonFactory", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}

Whereas the output with 1.6 was:

{:warning "clashing jar item", :path ".DS_Store", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/com.fasterxml.jackson.core.JsonFactory", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/Location.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/ReferenceResolver.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLEvent.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLInputStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLName.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/XMLStreamException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/utils/NestedThrowable$Util.class", :strategy :noop}
{:warning "clashing jar item", :path "org/apache/xmlbeans/xml/stream/utils/NestedThrowable.class", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/javax.servlet.ServletContainerInitializer", :strategy :concat-lines}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRFileStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ANTLRInputStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AbstractPredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ActionTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AmbiguityInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ArrayPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATN.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$AbstractConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$ConfigEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet$ConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNConfigSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializationOptions.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNDeserializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSerializer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ATNType.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/AtomTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BasicBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BasicState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BlockEndState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/BlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ContextSensitivityInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionEventInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/DecisionState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/EmptyPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/EpsilonTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ErrorInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerActionExecutor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerActionType.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNConfig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNSimulator$SimState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerChannelAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerCustomAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerIndexedCustomAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerMoreAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerPopModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerPushModeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerSkipAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LexerTypeAction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LL1Analyzer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LookaheadEventInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/LoopEndState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/NotSetTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/OrderedATNConfigSet$LexerConfigHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/OrderedATNConfigSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ParseInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ParserATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PlusBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PlusLoopbackState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PrecedencePredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredicateEvalInfo.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredicateTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContext$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionContextCache.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode$AltAndContextConfigEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode$AltAndContextMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/PredictionMode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/ProfilingATNSimulator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RangeTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleStopState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/RuleTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$AND.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$Operator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$OR.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$PrecedencePredicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext$Predicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SemanticContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SetTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/SingletonPredictionContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarBlockStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarLoopbackState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/StarLoopEntryState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/TokensStartState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/Transition$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/Transition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/atn/WildcardTransition.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BailErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BaseErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/BufferedTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CharStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonTokenFactory.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/CommonTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ConsoleErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/DefaultErrorStrategy.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFA$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFA.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFASerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFAState$PredPrediction.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/DFAState.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/dfa/LexerDFASerializer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/DiagnosticErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/FailedPredicateException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/InputMismatchException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/InterpreterRuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/IntStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Lexer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/LexerInterpreter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/LexerNoViableAltException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ListTokenSource.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/AbstractEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Array2DHashSet$SetIterator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Array2DHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/DoubleKeyMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/EqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/FlexibleHashMap$Entry.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/FlexibleHashMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntegerList.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntegerStack.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Interval.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntervalSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/IntSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/LogManager$Record.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/LogManager.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/MultiMap.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/MurmurHash.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/NotNull.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/ObjectEqualityComparator.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/OrderedHashSet.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Pair.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/ParseCancellationException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Predicate.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/TestRig.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Triple.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/misc/Utils.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/NoViableAltException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser$TraceListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser$TrimToSizeListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Parser.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ParserInterpreter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ParserRuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/ProxyErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RecognitionException.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Recognizer$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Recognizer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuleContext.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuleContextWithAltNum.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/RuntimeMetaData.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Token.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenFactory.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenSource.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$InsertBeforeOp.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$ReplaceOp.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter$RewriteOperation.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/TokenStreamRewriter.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/AbstractParseTreeVisitor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ErrorNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ErrorNodeImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeProperty.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeVisitor.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/ParseTreeWalker.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/Chunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreeMatch.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePattern.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher$CannotInvokeStartRule.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher$StartRuleDoesNotConsumeFullPattern.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/RuleTagToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TagChunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TextChunk.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/pattern/TokenTagToken.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/RuleNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/SyntaxTree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/TerminalNode.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/TerminalNodeImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/Tree.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/Trees.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPath$1.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPath.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathLexer.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathLexerErrorListener.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathRuleAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathRuleElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathTokenAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathTokenElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathWildcardAnywhereElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/tree/xpath/XPathWildcardElement.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/UnbufferedCharStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/UnbufferedTokenStream.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/Vocabulary.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/VocabularyImpl.class", :strategy :noop}
{:warning "clashing jar item", :path "org/antlr/v4/runtime/WritableToken.class", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/maven/org.antlr/antlr4-runtime/pom.xml", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/maven/org.antlr/antlr4-runtime/pom.properties", :strategy :noop}
{:warning "clashing jar item", :path "about.html", :strategy :noop}
{:warning "clashing jar item", :path "META-INF/services/com.fasterxml.jackson.core.JsonFactory", :strategy :concat-lines}
{:warning "clashing jar item", :path "about.html", :strategy :noop}

I haven't looked yet to see if those are identical.

NoSuchFileException upgrading from 0.1.7 to 0.2.0

Hey Sean,

We're getting a java.nio.file.NoSuchFileException: /tmp/depstar6800417798843186518/dist/catalogue.jar upgrading from 0.1.7 to 0.2.0 - calling with main-opts ["-m" "hf.depstar.uberjar" "dist/catalogue.jar"]. My guess would be that it's not creating parent directories, or something similar?

Stack trace:

	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
	at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
	at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:434)
	at java.nio.file.Files.newOutputStream(Files.java:216)
	at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:116)
	at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
	at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
	at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
	at hf.depstar.uberjar$run.invokeStatic(uberjar.clj:228)
	at hf.depstar.uberjar$run.invoke(uberjar.clj:218)
	at hf.depstar.uberjar$_main.invokeStatic(uberjar.clj:243)
	at hf.depstar.uberjar$_main.invoke(uberjar.clj:241)

Will have a dig if I get a spare 10 mins or so.

Cheers,

James

Data readers file clash prevents consumption of the rest of the jar

It seems that when consuming multiple jars that contain data_readers.clj, merging of the second data_readers.clj file prevents consuming the rest of the jar. For example, with the following minimal deps.edn:

{:deps    {clj-time/clj-time  {:mvn/version "0.15.0"}
           java-time-literals {:mvn/version "2018-04-06"}}
 :aliases {:uberjar {:extra-deps  {seancorfield/depstar {:mvn/version "0.1.5"}}
                     :main-opts   ["-m" "hf.depstar.uberjar" "bug.jar"]}}}

The java-time-literals jar contains:

M Filemode      Length  Date         Time      File
- ----------  --------  -----------  --------  --------------------------------------------------------------------
  -rw-rw-rw-       121   6-Apr-2018  14:36:46  meta-inf/manifest.mf
  -rw-rw-rw-      2157   6-Apr-2018  14:36:46  META-INF/maven/java-time-literals/java-time-literals/pom.xml
  -rw-rw-rw-       435   6-Apr-2018  14:36:46  META-INF/leiningen/java-time-literals/java-time-literals/project.clj
  -rw-rw-rw-       435   6-Apr-2018  14:36:46  project.clj
  -rw-rw-rw-      3331   6-Apr-2018  14:36:46  META-INF/leiningen/java-time-literals/java-time-literals/README.md
  -rw-rw-rw-      1487   6-Apr-2018  14:36:46  META-INF/leiningen/java-time-literals/java-time-literals/LICENSE
  drwxrwxrwx         0   6-Apr-2018  14:36:46  meta-inf/
  drwxrwxrwx         0   6-Apr-2018  14:36:46  META-INF/maven/
  drwxrwxrwx         0   6-Apr-2018  14:36:46  META-INF/maven/java-time-literals/
  drwxrwxrwx         0   6-Apr-2018  14:36:46  META-INF/maven/java-time-literals/java-time-literals/
  -rw-rw-rw-       170   6-Apr-2018  14:36:46  META-INF/maven/java-time-literals/java-time-literals/pom.properties
  -rw-rw-rw-       914   6-Apr-2018  14:00:10  data_readers.clj
  drwxrwxrwx         0   6-Apr-2018  14:14:18  java_time_literals/
  -rw-rw-rw-      6051   6-Apr-2018  14:14:18  java_time_literals/core.clj
- ----------  --------  -----------  --------  --------------------------------------------------------------------
                 15101                         14 files

... but the java_time_literals/core.clj file is not included in the uberjar. I suspect this may be due to stateful java IO, but I'm not sure.

AOT compile into a temp folder

This has several benefits:

  • The classes folder would not need to be manually created by the user
  • Staleness of compiled classes is avoided (fresh temp folder every time)
  • The classes folder does not need to be added to the classpath by the user

2.0: option to include user deps in basis?

By default, the project basis should be as if -Srepro was specified. There might be situations where the user deps.edn should be included so perhaps provide an option to depstar to do that?

Running on Windows causes exception

Here is the project to repro:

https://github.com/sparkofreason/depstar-test

This is the error:

PS C:\Users\dave\Projects\uberjar-test> clojure -A:uberjar
{:warning "clashing jar item", :path "edu/emory/mathcs/utils/ConcurrencyUtils$CustomExceptionHandler.class", :strategy :noop}
{:warning "clashing jar item", :path "edu/emory/mathcs/utils/ConcurrencyUtils$CustomThreadFactory.class", :strategy :noop}
{:warning "clashing jar item", :path "edu/emory/mathcs/utils/ConcurrencyUtils.class", :strategy :noop}
Exception in thread "main" java.nio.file.NoSuchFileException: C:\Users\dave\AppData\Local\Temp\uberjar16821059387554463855\uncomplicate\neanderthal\aux.clj
        at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:231)
        at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
        at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
        at java.base/java.nio.file.Files.copy(Files.java:3066)
        at hf.depstar.uberjar$copy_BANG_.invokeStatic(uberjar.clj:92)
        at hf.depstar.uberjar$copy_BANG_.doInvoke(uberjar.clj:85)
        at clojure.lang.RestFn.invoke(RestFn.java:467)
        at hf.depstar.uberjar$eval190$fn__191$fn__192.invoke(uberjar.clj:141)
        at hf.depstar.uberjar$consume_jar.invokeStatic(uberjar.clj:106)
        at hf.depstar.uberjar$consume_jar.invoke(uberjar.clj:98)
        at hf.depstar.uberjar$eval190$fn__191.invoke(uberjar.clj:133)
        at clojure.lang.MultiFn.invoke(MultiFn.java:239)
        at hf.depstar.uberjar$copy_source.invokeStatic(uberjar.clj:174)
        at hf.depstar.uberjar$copy_source.invoke(uberjar.clj:172)
        at hf.depstar.uberjar$run$fn__224$fn__225.invoke(uberjar.clj:229)
        at clojure.core$run_BANG_$fn__8775.invoke(core.clj:7715)
        at clojure.lang.PersistentVector.reduce(PersistentVector.java:343)
        at clojure.core$reduce.invokeStatic(core.clj:6827)
        at clojure.core$run_BANG_.invokeStatic(core.clj:7710)
        at clojure.core$run_BANG_.invoke(core.clj:7710)
        at hf.depstar.uberjar$run$fn__224.invoke(uberjar.clj:229)
        at hf.depstar.uberjar$run.invokeStatic(uberjar.clj:228)
        at hf.depstar.uberjar$run.invoke(uberjar.clj:224)
        at hf.depstar.uberjar$_main.invokeStatic(uberjar.clj:235)
        at hf.depstar.uberjar$_main.invoke(uberjar.clj:233)
        at clojure.lang.AFn.applyToHelper(AFn.java:154)
        at clojure.lang.AFn.applyTo(AFn.java:144)
        at clojure.lang.Var.applyTo(Var.java:705)
        at clojure.core$apply.invokeStatic(core.clj:665)
        at clojure.main$main_opt.invokeStatic(main.clj:491)
        at clojure.main$main_opt.invoke(main.clj:487)
        at clojure.main$main.invokeStatic(main.clj:598)
        at clojure.main$main.doInvoke(main.clj:561)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.lang.Var.applyTo(Var.java:705)
        at clojure.main.main(main.java:37)

depstar to add files from the 'resources' dir

How can depstar add files from the 'resources' dir?
Currently it issues a warning like:
{:warning "ignoring unknown file type", :path "/my/resources/path/to/one/of/the/files.something"}

And currently there is no option to make it add the file to the JAR.

However my lib requires some files (e.g. JNI files) to be packed into the JAR....

Jar building fails with pom-only dependency

I found this bug when depstar failed to build a project with the dependency clojure2d 1.2.0-SNAPSHOT with the error :
No method in multimethod 'copy-source*' for dispatch value: :unknown

Tracing its transitive dependencies led to the culprit com.github.fommil.netlib/all which is specified as pomOnly:
https://github.com/haifengl/smile/blob/05a93e7951f93f9370b16cf0461aaab4a1e77c84/netlib/build.sbt

Minimal repro

Turns out any dep added with {:extension "pom"} causes the same error:

;; deps.edn
{:paths ["src"]
 :deps  {org.clojure/clojure   {:mvn/version "1.10.1"}
         seancorfield/depstar  {:mvn/version "0.3.1"}
         org.clojure/data.json {:mvn/version "0.2.6"
                                :extension   "pom"}}}
$ clojure -m hf.depstar.uberjar out.jar
Building uber jar: out.jar
Execution error (IllegalArgumentException) at hf.depstar.uberjar/copy-source (uberjar.clj:211).
No method in multimethod 'copy-source*' for dispatch value: :unknown

Full report at:
/var/folders/qx/s6knw7996g70rwlrgyjrhwyw0000gn/T/clojure-543572068677625078.edn

2.0: compute the project basis instead of using the runtime basis

Core t.d.a code that is needed to compute a project basis:

user=> (require '[clojure.tools.deps.alpha :as t])
nil
user=> (keys (t/find-edn-maps))
(:root-edn :user-edn :project-edn)
user=> (def deps (t/merge-edns (let [{:keys [root-edn user-edn project-edn]}] [root-edn user-edn project-edn])))
Syntax error macroexpanding clojure.core/let at (REPL:1:25).
[{:keys [root-edn user-edn project-edn]}] - failed: even-number-of-forms? at: [:bindings] spec: :clojure.core.specs.alpha/bindings
user=> (def deps (t/merge-edns (let [{:keys [root-edn user-edn project-edn]} (t/find-edn-maps)] [root-edn user-edn project-edn])))
#'user/deps
user=> (def combined (t/combine-aliases deps [:test :runner]))
#'user/combined
user=> (keys combined)
(:extra-paths :extra-deps :main-opts)
user=> combined
{:extra-paths ["src/test/clojure"], :extra-deps {org.clojure/test.check #:mvn{:version "1.0.0"}, com.cognitect/test-runner {:git/url "https://github.com/cognitect-labs/test-runner", :sha "f7ef16dc3b8332b0d77bc0274578ad5270fbfedd"}}, :main-opts ["-m" "cognitect.test-runner" "-d" "src/test/clojure"]}
user=> (def basis (t/calc-basis deps {:resolve-args combined :classpath-args combined}))
#'user/basis
user=> (keys basis)
(:classpath :classpath-args :mvn/repos :paths :classpath-roots :libs :aliases :resolve-args :deps)

2.0: provide an option to auto-create/sync pom.xml

Given that depstar now depends on t.d.a for computing the project basis (and classpath), it could also use it to automatically create/sync the pom.xml file to save you that extra step of running clojure -Spom yourself. This should be opt-in, the same way that overriding the group/artifact and/or version is opt-in.

When building an uberjar, make pom.xml optional

It is not really needed. You can provide :main-class which is all that MANIFEST.MF needs in order to support java -jar.

If you provide :group-id, :artifact-id, and :version, depstar should be able to fill that information in without a pom.xml file -- but for backward compatibility, it should generate pom.xml (i.e., trigger :sync-pom true as it does today) unless you specify :no-pom true.

If you do not provide those three, it should not trigger :sync-pom true (double-check current behavior).

depstar should allow you to build uberjars without pom.xml being present.

Verbose option

What would be the best way to add a verbose mode where the current classpath is printed and also all the files that are added to the uberjar? I'm willing to work on this but I noticed there is no tools.cli -- would it be acceptable to add it as dependency to parse the passed command line options?

Make compile an option

With the caveat that the user is responsible for creating the classes folder and adding it to the path.

Wrap compile call in try / catch for better error reporting.

Generate manifest and AOT compile without pom.xml?

I’m wondering whether this might be worth considering as a feature?

I, for one, am interested in using depstar to create an executable uberjar, but I don’t want to learn how to construct a pom.xml file, nor a MANIFEST.MF file. This seems like the sort of thing that tools like this should be able to do so as to reduce the cognitive load on their users.

What do you think?

Allow addition <tag> formats

Currently, depstar assumes the <tag> in pom.xml is the version with a prefix of v but people use lots of different conventions. @dharrigan mentioned this on Slack, that he uses just the version number.

A replacement like this could be used:

(str/replace-first "<project><scm><tag>clojure-1.2.3</tag>" #"<tag>([^<]*)1.2.3</tag>" "<tag>$11.2.4</tag>")

This means the version portion needs to be regex-quoted \\Q...\\E. Or use java.util.regex.Pattern/quote

Uberjar doesn't work on Windows due to shelling out and quoting issue

When trying to make an uberjar on Windows with depstar for this project, I got:

main] INFO hf.depstar.uberjar - Compiling pod.babashka.buddy ...
Execution error at clojure.main/main (main.java:40).
Invalid token: C:
Full report at:
C:\Users\appveyor\AppData\Local\Temp\1\clojure-3649748013505680792.edn
[main] ERROR hf.depstar.uberjar - Compilation of pod.babashka.buddy failed!

You can reproduce this issue by checking out the project at commit SHA cd98a0e331253e7d547febad8a3aa49ad2ff0cd8 and running clojure -X:uberjar (the arguments to depstar are provided in the deps.edn itself).

I suspected the error happened due to an odd behavior of shelling out on Windows using ProcessBuilder (and clojure.java.shell, etc): double quotes need to be escaped in shell arguments.

I've ran into this issue with several projects. Later on I made a library around ProcessBuilder which includes this fix for Windows automaticallly:

https://github.com/babashka/process/blob/ac1219508857d4b3106e5a7999a3573c61c7aa63/src/babashka/process.clj#L94-L101

I will provide a PR which fixes the issue in depstar for Windows by escaping double quotes in the shell arguments. I have already tested this solution and it fixed the problem.

You can verify that this PR works on Windows by checking out commit 423f14d33d0ceec1b339674b2b45cad415c08b8f and running clojure -X:uberjar again.

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.