buildr: les dépendances de package dans un seul pot
Question
J'ai un projet java qui est construit avec buildr et qui a des dépendances externes:
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
Je veux que cela construire un seul fichier jar autonome qui comprend toutes ces dépendances.
Comment puis-je faire?
(il y a une question de logique de suivi: Comment Je déshabille tout le code utilisé des dépendances inclus et package uniquement les classes que j'utilise en fait ?)
La solution
est ce que je fais en ce moment. Celui-ci utilise autojar pour tirer uniquement les dépendances nécessaires:
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
et plus tard:
package(:jar)
package(:jar).enhance { |pkg| pkg.enhance { |pkg| add_dependencies(pkg) }}
(mise en garde: Je sais peu de choses sur buildr, cela pourrait être tout à fait une mauvaise approche Il fonctionne pour moi, cependant.)
Autres conseils
J'apprends aussi Buildr et actuellement je suis d'emballage d'exécution Scala avec ma demande ainsi:
package(:jar).with(:manifest => _('src/MANIFEST.MF')).exclude('.scala-deps')
.merge('/var/local/scala/lib/scala-library.jar')
Aucune idée si cela est inférieure à autojar (commentaires sont les bienvenus), mais semble fonctionner avec un exemple simple. Prend 4,5 minutes pour emballer cette pensée scala-library.jar.
Voici comment je crée un Uberjar avec Buildr, cette personnalisation de ce qui est mis dans le pot et comment le Manifest est créé:
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
Il y a aussi une version qui prend en charge printemps, en enchaînant tous les spring.schemas