Buildr : 패키지 의존성 단일 항아리로 의존성
문제
나는 구축 된 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를 배우고 있으며 현재 내 응용 프로그램으로 스칼라 런타임을 포장하고 있습니다.
package(:jar).with(:manifest => _('src/MANIFEST.MF')).exclude('.scala-deps')
.merge('/var/local/scala/lib/scala-library.jar')
이것이 Autojar보다 열등한 지 알 수 없지만 (의견을 환영합니다) 간단한 예제로 작동하는 것 같습니다. Scala-library.jar 생각을 포장하는 데 4.5 분이 걸립니다.
나는 사용할 것이다 계단식 내 예를 위해 :
cascading_dev_jars = Dir[_("#{ENV["CASCADING_HOME"]}/build/cascading-{core,xml}-*.jar")]
#...
package(:jar).include cascading_dev_jars, :path => "lib"
다음은 Buildr로 Uberjar를 만드는 방법입니다. 항아리에 넣은 내용의 사용자 정의 및 매니페스트가 어떻게 생성되는지.
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
제휴하지 않습니다 StackOverflow