【问题标题】:buildr: package dependencies into a single jarbuildr:将依赖项打包到单个 jar 中
【发布时间】:2009-08-14 18:30:32
【问题描述】:

我有一个使用 buildr 构建的 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 文件。

我该怎么做?

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

【问题讨论】:

    标签: java maven-2 jar packaging buildr


    【解决方案1】:

    这就是我现在正在做的事情。这使用 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 知之甚少,这可能是完全错误的方法。不过它对我有用)

    【讨论】:

    • 这是真正的正确答案。我在下面的回答只是将罐子添加到 lib 文件夹中,该文件夹在 Hadoop 中工作,但在其他地方没有。
    • 这工作正常 - 分叉到 shell 可以完成工作。也许一种更好的方式是这种方法gist.github.com/981589
    【解决方案2】:

    我也在学习 Buildr,目前我正在以这种方式将 Scala 运行时与我的应用程序打包在一起:

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

    不知道这是否不如 autojar(欢迎使用 cmets),但似乎可以使用一个简单的示例。打包 scala-library.jar 的想法需要 4.5 分钟。

    【讨论】:

    • autojar 的好处是它还去除了程序中从未使用过的依赖项(基于字节码检查)——所以理论上你应该得到一个更小的结果文件
    • 这是正确的答案,因为它使用内置构建器功能
    • 我会支持这个;这是使用 buildr 的方法。
    • 对于那些需要 Ruby 帮助的人,请将两者放在一起以获得简单的答案:package(:jar).merge(compile.dependencies)
    【解决方案3】:

    我将使用Cascading 作为示例:

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

    【讨论】:

      【解决方案4】:

      以下是我如何使用 Buildr 创建 Uberjar、自定义放入 Jar 中的内容以及如何创建 Manifest:

      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,通过连接所有的spring.schemas

      【讨论】:

        猜你喜欢
        • 2014-10-13
        • 2015-11-24
        • 2012-11-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        相关资源
        最近更新 更多