9

Builderでビルドされ、外部依存関係があるJavaプロジェクトがあります。

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ファイルを作成する必要があります。

それ、どうやったら出来るの?

(論理的なフォローアップの質問があります:含まれている依存関係からすべての未使用のコードを取り除き、実際に使用するクラスのみをパッケージ化するにはどうすればよいですか?)

4

4 に答える 4

8

これが私が今していることです。これは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) }}

(注意:ビルダーについてはほとんど知りません。これは完全に間違ったアプローチである可能性があります。ただし、私にとってはうまくいきます)

于 2009-08-16T20:37:25.773 に答える
7

私はBuildrも学んでおり、現在、Scalaランタイムをアプリケーションに次のようにパックしています。

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

これがautojarより劣っているかどうかはわかりませんが(コメントは大歓迎です)、簡単な例で機能するようです。そのscala-library.jarの考えをパッケージ化するのに4.5分かかります。

于 2010-12-16T19:25:18.100 に答える
0

私の例ではカスケードを使用します。

cascading_dev_jars = Dir[_("#{ENV["CASCADING_HOME"]}/build/cascading-{core,xml}-*.jar")]
#...
package(:jar).include cascading_dev_jars, :path => "lib"
于 2009-10-28T20:48:34.817 に答える
0

これが、Buildrを使用してUberjarを作成する方法、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を連結することにより、 Springをサポートするバージョンもあります。

于 2012-09-04T05:22:14.613 に答える