buildr:упакуйте зависимости в один jar
Вопрос
У меня есть java-проект, который построен с buildr и это имеет некоторые внешние зависимости:
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
Я хочу, чтобы это позволило создать единый автономный jar-файл, который включает в себя все эти зависимости.
Как мне это сделать?
(возникает логичный последующий вопрос: Как я могу удалить весь неиспользуемый код из включенных зависимостей и упаковать только те классы, которые я фактически использую?)
Решение
Это то, что я делаю прямо сейчас.При этом используется autojar для извлечения только необходимых зависимостей:
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
и позже:
package(:jar)
package(:jar).enhance { |pkg| pkg.enhance { |pkg| add_dependencies(pkg) }}
(предостережение:Я мало знаю о buildr, это может быть совершенно неправильный подход.Хотя у меня это работает)
Другие советы
Я также изучаю Buildr и в настоящее время я упаковываю Scala runtime в свое приложение таким образом:
package(:jar).with(:manifest => _('src/MANIFEST.MF')).exclude('.scala-deps')
.merge('/var/local/scala/lib/scala-library.jar')
Понятия не имею, уступает ли это autojar (комментарии приветствуются), но, похоже, работает на простом примере.Требуется 4,5 минуты, чтобы сформулировать эту мысль scala-library.jar мысль.
Я собираюсь использовать Каскадирующий для моего примера:
cascading_dev_jars = Dir[_("#{ENV["CASCADING_HOME"]}/build/cascading-{core,xml}-*.jar")]
#...
package(:jar).include cascading_dev_jars, :path => "lib"
Вот как я создаю Uberjar с помощью Buildr, это настройка того, что помещается в Jar и как создается манифест:
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
Существует также версия , что поддерживает Пружину, путем объединения всех spring.schemas