2009-08-14 10 views
9

Tengo un proyecto java que se construye con buildr y que tiene algunas dependencias externas:Buildr: dependencias de los paquetes en un solo frasco

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 

quiero esto para construir un único archivo JAR independiente que incluye todas estas dependencias .

¿Cómo puedo hacer eso?

(hay una pregunta de seguimiento lógico:? How can I strip all the unused code from the included dependencies and only package the classes I actually use)

Respuesta

8

Esto es lo que estoy haciendo en este momento. Esto utiliza autojar para tirar sólo las dependencias necesarias:

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 

y posteriores:

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

(advertencia:. Yo sé poco sobre Buildr, esto podría ser totalmente el enfoque equivocado Funciona para mí, sin embargo)

+0

Esta es la respuesta correcta. Mi respuesta a continuación solo agrega los archivos jar a la carpeta 'lib' que funciona en Hadoop pero en ningún otro lado. –

+0

Esto funciona bien: el bifurcación al caparazón está bien para hacer el trabajo. Tal vez una forma más elegante sería este tipo de enfoque https://gist.github.com/981589 –

0

voy a utilizar para mi Cascading ejemplo:

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

También estoy aprendiendo Buildr y actualmente estoy empacando Scala tiempo de ejecución con mi solicitud de esta manera:

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

ni idea de si este es inferior a autojar (comentarios son bienvenidos), pero parece que funciona con una ejemplo simple Toma 4.5 minutos para empacar ese pensamiento de scala-library.jar.

+0

Lo bueno de autojar es que también elimina las dependencias que nunca se utilizan en el programa (en función de la inspección bytecode), por lo que en teoría debería obtener un archivo de resultados más pequeño – levinalex

+2

ESTA es la respuesta correcta, ya que usa una función de compilación en buildr –

+0

Lo haré en segundo lugar; esta es la manera de hacerlo usando buildr. –

0

Aquí es cómo creo una Uberjar con Buildr, esta personalización de lo que se pone en el frasco y cómo se crea el manifiesto:

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 

También hay una versión que supports Spring, mediante la concatenación de todos los spring.schemas

Cuestiones relacionadas