boot icon indicating copy to clipboard operation
boot copied to clipboard

push tasks :file and :pom options don't search in fileset

Open martinklepsch opened this issue 8 years ago • 12 comments

The code to find the jar and pom file given to a push tasks uses io/file which essentially prevents you from specifying a file in the fileset. This in turn requires you to output things into target to make things work.

Proposal: We search for both files in the following order:

  • exact fileset match
  • classpath match (io/resource... )
  • file match (io/file ...)

Also exceptions around some of this stuff could be improved. If there's a realistic chance to get this into 2.7.2 I'd be very happy to start working on this ASAP.

Pinging @Deraen @arichiardi @SevereOverfl0w for opinions :)

martinklepsch avatar Jul 21 '17 01:07 martinklepsch

Reproduction snippet:

boot -d hiccup pom -p testing.org/xxx -v 0.0.1 uber jar push --repo "clojars" --file "project.jar"

martinklepsch avatar Jul 21 '17 09:07 martinklepsch

Totally agree we should look into the fileset first.

arichiardi avatar Jul 21 '17 09:07 arichiardi

If you fix the above snippet by using the target task you still run into the issue that there most likely will be multiple pom.xml

boot -d hiccup -C pom -p testing.org/xxx -v 0.0.1 uber jar target push --repo "clojars" --file "target/project.jar"
Writing pom.xml and pom.properties...
Adding uberjar entries...
Writing project.jar...
Writing target dir(s)...
clojure.lang.ExceptionInfo: Multiple jar entries match: .*/pom.xml
    data: {:file
           "/var/folders/tt/hdgn6rc92pv68rscfj8jn8nh0000gn/T/boot.user8395542443886862570.clj",
           :line 13}
       java.lang.Exception: Multiple jar entries match: .*/pom.xml
           boot.pod/find-in-jarfile       pod.clj:  121
                   boot.pod/pom-xml       pod.clj:  205
               boot.pod/pom-xml-map       pod.clj:  417
     boot.task.built-in/fn/fn/fn/fn  built_in.clj:  871
     boot.task.built-in/fn/fn/fn/fn  built_in.clj:  303
     boot.task.built-in/fn/fn/fn/fn  built_in.clj:  717
     boot.task.built-in/fn/fn/fn/fn  built_in.clj:  594
     boot.task.built-in/fn/fn/fn/fn  built_in.clj:  433
                boot.core/run-tasks      core.clj:  938
                  boot.core/boot/fn      core.clj:  948
clojure.core/binding-conveyor-fn/fn      core.clj: 1938
                                ...

martinklepsch avatar Jul 21 '17 09:07 martinklepsch

This in turn means that you will need to supply the path to the pom.xml manually. If you make a typo this is the error:

 clojure.lang.ExceptionInfo: entry
    data: {:file
           "/var/folders/tt/hdgn6rc92pv68rscfj8jn8nh0000gn/T/boot.user6605178178184909072.clj",
           :line 13}
java.lang.NullPointerException: entry
                                ...
                   boot.pod/pom-xml       pod.clj:  206
               boot.pod/pom-xml-map       pod.clj:  417

martinklepsch avatar Jul 21 '17 09:07 martinklepsch

So currently what you need to do is this:

boot -d hiccup -C \ 
pom -p foo/bar -v 0.0.1 \
uber \
jar \
target \
push --repo "clojars" --file "target/project.jar" --pom "target/META-INF/maven/foo/bar/pom.xml" 

martinklepsch avatar Jul 21 '17 10:07 martinklepsch

So as we just discovered, the :project option to jar makes pom understand where the pom is with no external help.

It looks a bit magic and I am now wondering if pom reads jar options to know that or something else is going on.

Sent from my Android device with K-9 Mail. Please excuse my brevity.

arichiardi avatar Jul 21 '17 11:07 arichiardi

The :project value is employed by jar in order to sift poms https://github.com/boot-clj/boot/blob/master/boot/core/src/boot/task/built_in.clj#L842 so it is important there

arichiardi avatar Jul 21 '17 11:07 arichiardi

The push task is able to properly find the jar so supplying :file isn't needed as often.

If you build uberjars you will need to supply the pom.xml path however. You can do that by passing the pom option but maybe it's better to just take the :project option as it's done for the jar task and find the pom.xml according to the project name.

martinklepsch avatar Jul 21 '17 12:07 martinklepsch

Thinking more about this the core really is that there are multiple pom files in the fileset once you use uber maybe instead of introducing yet another option we could do something to prevent that issue before it comes up.

martinklepsch avatar Jul 21 '17 13:07 martinklepsch

So a solution that does not require any code changes is passing a proper :exclude set to the uber task this:

(uber :exclude #{ #"(?i)^META-INF/INDEX.LIST$"
                  #"(?i)^META-INF/[^/]*\.(MF|SF|RSA|DSA)$"
                  #"META-INF/maven/" })

martinklepsch avatar Jul 21 '17 14:07 martinklepsch

Yeah after you said that I was thinking of sifting but the above looks better. In any case this is probably something that needs to be documented very well somewhere

arichiardi avatar Jul 21 '17 14:07 arichiardi

Maybe it should be the default? I don't see why (by default) you'd want multiple pom.xml inside your uberjar.

martinklepsch avatar Jul 21 '17 15:07 martinklepsch