lib/java/eclipse.rb in buildr-0.18.0 vs lib/java/eclipse.rb in buildr-0.19.0

- old
+ new

@@ -1,53 +1,68 @@ require "pathname" +require "core/project" +require "java/artifact" module Buildr # Global task "eclipse" generates artifacts for all projects. desc "Generate Eclipse artifacts for all projects" - Project.local_task task("eclipse"=>"artifacts") + Project.local_task "eclipse"=>"artifacts" Project.on_define do |project| eclipse = project.recursive_task("eclipse") project.enhance do |project| # We need paths relative to the top project's base directory. root_path = lambda { |p| f = lambda { |p| p.parent ? f[p.parent] : p.base_dir } ; f[p] }[project] - # We're guessing the Rakefile is there, but keep in mind it might not exist - # (most test cases don't create it). - sources = [] + # We want the Eclipse files changed every time the Rakefile changes, but also anything loaded by + # the Rakefile (buildr.rb, separate file listing dependencies, etc), so we add anything required + # after the Rakefile. So which don't know where Buildr shows up exactly, ignore files that show + # in $LOADED_FEATURES that we cannot resolve. + sources = ($LOADED_FEATURES - Buildr.instance_eval("@loaded_features_to_ignore")). + map { |file| File.expand_path(file) }.select { |file| File.exist?(file) } sources << File.expand_path(Rake.application.rakefile, root_path) if Rake.application.rakefile # Only for projects that are Eclipse packagable. if project.packages.detect { |pkg| pkg.type =~ /(jar)|(war)|(rar)|(mar)|(aar)/ } eclipse.enhance [ file(project.path_to(".classpath")), file(project.path_to(".project")) ] # The only thing we need to look for is a change in the Rakefile. file(project.path_to(".classpath")=>sources) do |task| puts "Writing #{task.name}" if verbose - + # Find a path relative to the project's root directory. - relative = lambda { |path| Pathname.new(path).relative_path_from(Pathname.new(project.path_to)).to_s } + relative = lambda do |path| + msg = [:to_path, :to_str, :to_s].find { |msg| path.respond_to? msg } + path = path.__send__(msg) + Pathname.new(path).relative_path_from(Pathname.new(project.path_to)).to_s + end + m2repo = Buildr::Repositories.instance.local File.open(task.name, "w") do |file| xml = Builder::XmlMarkup.new(:target=>file, :indent=>2) xml.classpath do # Internal: projects that create artifacts we find on the classpath. # External: other artifacts, typically from the local repository. internal, external = project.compile.classpath.map(&:to_s). map { |path| projects.detect { |prj| prj.packages.detect { |pkg| pkg.to_s == path } } || path }. partition { |path| path.is_a?(Project) } + vars, libs = external.partition { |path| path.to_s.index(m2repo) == 0 } + generated, libs = libs.partition { |path| path.to_s.index(project.path_to.to_s) == 0 } + xml.classpathentry :kind=>'con', :path=>'org.eclipse.jdt.launching.JRE_CONTAINER' # Collect all the classpaths, key is the kind, value is # string or array (or anything responding to to_a). - { :src => project.compile.sources.map { |src| relative[src] }, - :output => relative[project.path_to(:java_target_dir)], - :con => "org.eclipse.jdt.launching.JRE_CONTAINER", - :lib => external.map(&:to_s) + { :src => project.compile.sources.map { |src| relative[src] } + generated.map { |src| relative[src] }, + :output => relative[project.compile.target], + :lib => libs.map(&:to_s), + :var => vars.map { |path| path.to_s.sub(m2repo, 'M2_REPO') } }.each do |kind, paths| - paths.to_a.each { |path| xml.classpathentry :kind=>kind, :path=>path } + paths.sort.uniq.each do |path| + xml.classpathentry :kind=>kind, :path=>path + end end - internal.map(&:name).uniq.each do |prj_name| + internal.map(&:name).sort.uniq.each do |prj_name| xml.classpathentry :kind=>"src", :combineaccessrules=>"false", :path=>"/#{prj_name}" end end end end