2009-08-14 14 views
9

Ho un progetto Java che viene costruito con buildr e che ha alcune dipendenze esterne:Buildr: dipendenze dei pacchetti in un unico barattolo

repositories.remote << "http://www.ibiblio.org/maven2" 
repositories.remote << "http://packages.example/" 

define "myproject" do 
    compile.options.target = '1.5' 
    project.version = "1.0.0" 
    compile.with 'dependency:dependency-xy:jar:1.2.3' 
    compile.with 'dependency2:dependency2:jar:4.5.6' 

    package(:jar) 
end 

voglio questo per costruire un unico file jar autonomo che include tutte queste dipendenze .

Come faccio?

(c'è una domanda di follow-logica:? How can I strip all the unused code from the included dependencies and only package the classes I actually use)

risposta

8

Questo è quello che sto facendo in questo momento. Questo utilizza autojar a tirare solo le dipendenze necessarie:

def add_dependencies(pkg) 
    tempfile = pkg.to_s.sub(/.jar$/, "-without-dependencies.jar") 
    mv pkg.to_s, tempfile 

    dependencies = compile.dependencies.map { |d| "-C#{d}"}.join(" ") 
    sh "java -jar tools/autojar.jar -baev -o #{pkg} #{dependencies} #{tempfile}" 
end 

e successivi:

package(:jar) 
package(:jar).enhance { |pkg| pkg.enhance { |pkg| add_dependencies(pkg) }} 

(avvertimento:. So poco di Buildr, questo potrebbe essere del tutto l'approccio sbagliato Funziona per me, però)

+0

Questa è la risposta corretta. La mia risposta qui sotto aggiunge solo i jar alla cartella 'lib' che funziona in Hadoop ma da nessun'altra parte. –

+0

Funziona benissimo: il biforcarsi alla shell è ok per completare il lavoro. Forse un modo più elaborato sarebbe questo tipo di approccio https://gist.github.com/981589 –

0

ho intenzione di utilizzare Cascading per il mio esempio:

cascading_dev_jars = Dir[_("#{ENV["CASCADING_HOME"]}/build/cascading-{core,xml}-*.jar")] 
#... 
package(:jar).include cascading_dev_jars, :path => "lib" 
7

Sto anche imparando Buildr e attualmente sto imballaggio Scala runtime con la mia domanda in questo modo:

package(:jar).with(:manifest => _('src/MANIFEST.MF')).exclude('.scala-deps') 
    .merge('/var/local/scala/lib/scala-library.jar') 

Non ho idea se questo è inferiore a autojar (i commenti sono benvenuti), ma sembra funzionare con un semplice esempio. Ci vogliono 4,5 minuti per confezionare quello scala-library.jar pensato.

+0

la cosa bella di autojar è che toglie anche le dipendenze che non sono mai usate nel tuo programma (basato su ispezione bytecode) - quindi in teoria dovresti ottenere un file dei risultati più piccolo – levinalex

+2

Questa è la risposta giusta poiché usa una build in buildr funzione –

+0

In secondo luogo; questo è il modo di farlo usando buildr. –

0

Ecco come posso creare un Uberjar con Buildr, questa personalizzazione di ciò che viene messo in vaso e come viene creato il manifesto:

assembly_dir = 'target/assembly' 
main_class = 'com.something.something.Blah' 

artifacts = compile.dependencies 

artifacts.each do |artifact| 
    Unzip.new(_(assembly_dir) => artifact).extract 
end 

# remove dirs from assembly that should not be in uberjar 
FileUtils.rm_rf("#{_(assembly_dir)}/example/package") 
FileUtils.rm_rf("#{_(assembly_dir)}/example/dir") 

# create manifest file 
File.open(_("#{assembly_dir}/META-INF/MANIFEST.MF"), 'w') do |f| 
    f.write("Implementation-Title: Uberjar Example\n") 
    f.write("Implementation-Version: #{project_version}\n") 
    f.write("Main-Class: #{main_class}\n") 
    f.write("Created-By: Buildr\n")     
end 

present_dir = Dir.pwd 
Dir.chdir _(assembly_dir) 
puts "Creating #{_("target/#{project.name}-#{project.version}.jar")}" 
`jar -cfm #{_("target/#{project.name}-#{project.version}.jar")} #{_(assembly_dir)}/META-INF/MANIFEST.MF .` 
Dir.chdir present_dir 

C'è anche una versione che supports Spring, concatenando tutte le spring.schemas

Problemi correlati