代码之家  ›  专栏  ›  技术社区  ›  levinalex

builder:将依赖项打包到单个jar中

  •  9
  • levinalex  · 技术社区  · 15 年前

    我有一个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文件,其中包含所有这些依赖项。

    我该怎么做?

    (有一个合乎逻辑的后续问题: How can I strip all the unused code from the included dependencies and only package the classes I actually use ?)

    4 回复  |  直到 12 年前
        1
  •  8
  •   levinalex    15 年前

    这就是我现在要做的。这将使用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) }}
    

    (警告:我对builder知之甚少,这可能是完全错误的做法。不过,这对我有用)

        2
  •  7
  •   user272735    14 年前

    我也在学习builder,目前我正在用我的应用程序打包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分钟。

        3
  •  0
  •   Nate Murray    15 年前

    我要用 Cascading 以我为例:

    cascading_dev_jars = Dir[_("#{ENV["CASCADING_HOME"]}/build/cascading-{core,xml}-*.jar")]
    #...
    package(:jar).include cascading_dev_jars, :path => "lib"
    
        4
  •  0
  •   mguymon    12 年前

    下面是我如何使用builder创建一个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
    

    还有一个版本 supports Spring ,将所有 图式