├── .gitignore ├── lib ├── ant │ ├── rake.rb │ ├── tasks │ │ └── raketasks.rb │ ├── target.rb │ ├── element.rb │ └── ant.rb └── ant.rb ├── samples ├── java_src │ └── A.java ├── rake_import_example │ ├── Rakefile │ └── build.xml └── simple_compile.rb ├── src └── org │ └── jruby │ └── ant │ ├── RakeImport.java │ ├── Rake.java │ └── RakeTaskBase.java ├── nbproject ├── genfiles.properties ├── project.xml ├── project.properties └── build-impl.xml ├── Rakefile └── README /.gitignore: -------------------------------------------------------------------------------- 1 | samples/java_build 2 | samples/*.jar 3 | build 4 | dist 5 | nbproject/private 6 | *~ 7 | -------------------------------------------------------------------------------- /lib/ant/rake.rb: -------------------------------------------------------------------------------- 1 | def ant_task(*args, &block) 2 | task = task(*args, &block) 3 | ant.add_target task 4 | ant.execute_target task.name 5 | end -------------------------------------------------------------------------------- /samples/java_src/A.java: -------------------------------------------------------------------------------- 1 | public class A { 2 | public static void main(String[] args) { 3 | System.out.println("Hello World"); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /samples/rake_import_example/Rakefile: -------------------------------------------------------------------------------- 1 | directory './make_me' 2 | 3 | task :should_not_run do 4 | puts "We should not see this" 5 | end 6 | 7 | task :its_in_rake => [:setup, :its_in_ant] do 8 | puts "it's in Rake" 9 | end 10 | 11 | task :setup => './make_me' do 12 | puts "setup in Rake" 13 | end 14 | 15 | -------------------------------------------------------------------------------- /src/org/jruby/ant/RakeImport.java: -------------------------------------------------------------------------------- 1 | package org.jruby.ant; 2 | 3 | import org.apache.tools.ant.BuildException; 4 | 5 | public class RakeImport extends RakeTaskBase { 6 | @Override 7 | public void execute() throws BuildException { 8 | super.execute(); 9 | 10 | rakeMethod("import", handleFilenameArgument()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /nbproject/genfiles.properties: -------------------------------------------------------------------------------- 1 | build.xml.data.CRC32=48b759f9 2 | build.xml.script.CRC32=a4ea63e4 3 | build.xml.stylesheet.CRC32=958a1d3e@1.32.1.45 4 | # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. 5 | # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. 6 | nbproject/build-impl.xml.data.CRC32=48b759f9 7 | nbproject/build-impl.xml.script.CRC32=9caf7ec3 8 | nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45 9 | -------------------------------------------------------------------------------- /samples/rake_import_example/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Builds, tests, and runs the project akakamiari. 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.netbeans.modules.java.j2seproject 4 | 5 | 6 | akakamiari 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lib/ant/tasks/raketasks.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'rake' 3 | require 'ant' 4 | 5 | class RakeWrapper 6 | def load_tasks(*args) 7 | # FIXME: Use our arguments (this sucks...let's submit a patch for Rake 8 | ARGV.clear 9 | ARGV.concat args 10 | 11 | Rake.application.tap do |application| 12 | application.init 13 | application.load_rakefile 14 | end 15 | end 16 | 17 | def execute(*args) 18 | load_tasks(*args).top_level 19 | end 20 | 21 | def invoke_task(task) 22 | Rake.application[task].invoke 23 | end 24 | 25 | def import(*args) 26 | ant = Ant.new 27 | load_tasks(*args).tasks.each { |rake_task| ant.add_target rake_task } 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /lib/ant.rb: -------------------------------------------------------------------------------- 1 | require 'java' 2 | 3 | class Ant 4 | def self.get_from_ant 5 | IO.popen("ant -diagnostics") do |diag| 6 | home = diag.readlines.grep(/ant.home/).first.sub('ant.home: ', '').chomp 7 | return home if home 8 | end 9 | nil 10 | end 11 | 12 | def self.locate_ant_home 13 | return ENV['ANT_HOME'] if ENV['ANT_HOME'] && File.exist?(ENV['ANT_HOME']) 14 | get_from_ant 15 | end 16 | 17 | ANT_HOME = locate_ant_home 18 | end 19 | 20 | # ant-launcher.jar is required because we use Project.init() 21 | $CLASSPATH << File.join(Ant::ANT_HOME, 'lib', 'ant.jar') 22 | $CLASSPATH << File.join(Ant::ANT_HOME, 'lib', 'ant-launcher.jar') 23 | 24 | require 'ant/ant' 25 | require 'ant/rake' if defined?(::Rake) 26 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | LIB_DIR = File.join File.dirname(__FILE__), 'lib' 2 | $LOAD_PATH << LIB_DIR 3 | 4 | require 'rake/clean' 5 | require 'ant' 6 | 7 | JAVA_CLASSES_DIR = 'build/classes' 8 | 9 | CLEAN.include '**/*~', 'samples/java_build/*', 'build/*' 10 | 11 | task :default => :compile do 12 | puts "default_task executing" 13 | end 14 | 15 | task :compile => :setup do 16 | puts "compile_task executing" 17 | ant.javac :srcdir => 'src', :destdir => JAVA_CLASSES_DIR do 18 | classpath do 19 | pathelement :location => File.join(Ant::ANT_HOME, 'lib', 'ant.jar') 20 | pathelement :location => File.join(LIB_DIR, 'jruby-complete.jar') 21 | end 22 | end 23 | end 24 | 25 | task :setup do 26 | puts "setup_task_executing" 27 | mkdir_p JAVA_CLASSES_DIR 28 | end 29 | -------------------------------------------------------------------------------- /src/org/jruby/ant/Rake.java: -------------------------------------------------------------------------------- 1 | package org.jruby.ant; 2 | 3 | import java.util.List; 4 | import org.apache.tools.ant.BuildException; 5 | 6 | public class Rake extends RakeTaskBase { 7 | private String taskname; // A list? 8 | 9 | @Override 10 | public void execute() throws BuildException { 11 | super.execute(); 12 | List args = handleFilenameArgument(); 13 | 14 | if (taskname != null) args.add(taskname); 15 | 16 | rakeMethod("execute", args.toArray(new Object[args.size()])); 17 | } 18 | 19 | // FIXME?: Allow list of tasks to be executed 20 | public void setTask(String taskname) { 21 | this.taskname = taskname; 22 | } 23 | // FIXME: Add flag to allow registering all defined ant tasks in Rake dependency tree? 24 | } 25 | -------------------------------------------------------------------------------- /lib/ant/target.rb: -------------------------------------------------------------------------------- 1 | require 'java' 2 | require 'ant/ant' 3 | 4 | java_import org.apache.tools.ant.Target 5 | 6 | class Ant 7 | class RakeTarget < Target 8 | ALREADY_DEFINED_PREFIX = "rake_" 9 | 10 | def initialize(ant, rake_task) 11 | super() 12 | set_project ant.project 13 | set_name generate_unique_target_name rake_task.name 14 | 15 | rake_task.prerequisites.each { |prereq| add_dependency prereq } 16 | 17 | @rake_task = rake_task 18 | end 19 | 20 | def execute 21 | @rake_task.execute 22 | end 23 | 24 | private 25 | def generate_unique_target_name(name) 26 | # FIXME: This is not guaranteed to be unique and may be a wonky naming convention? 27 | if project.targets.include?(name) 28 | project.log "ant already defines #{name}. Redefining as #{ALREADY_DEFINED_PREFIX}#{name}" 29 | name = ALREADY_DEFINED_PREFIX + name 30 | end 31 | name 32 | end 33 | end 34 | end -------------------------------------------------------------------------------- /samples/simple_compile.rb: -------------------------------------------------------------------------------- 1 | require 'ant' 2 | 3 | # The lower you set this the less ant internal debugging output you will see.. 4 | output_level = 5 5 | 6 | ant(:output_level => output_level) do 7 | # Regular Ruby variable interact fine 8 | build_dir = "java_build" 9 | 10 | # But defining and consuming ant properties is fine 11 | property :name => "src.dir", :value => "java_src" 12 | 13 | # This will end up not being used by ant because there is no 'classes' 14 | # directory. It is useful to see that ant figures this out when the 15 | # debug output_level is higher. You should see a message like: 16 | # 'dropping .../akakamiari/samples/classes from path as it doesn't exist' 17 | path(:id => "project.class.path") do 18 | pathelement :location => "classes" 19 | end 20 | 21 | echo :message => "SOURCE DIR IS: ${src.dir}" 22 | echo :message => "BUILD DIR IS: ${build.dir}" 23 | 24 | mkdir :dir => build_dir 25 | 26 | javac(:destdir => build_dir) do 27 | classpath :refid => "project.class.path" 28 | src do 29 | pathelement :location => "${src.dir}" 30 | end 31 | end 32 | 33 | jar :destfile => "simple_compile.jar", :basedir => build_dir 34 | end 35 | -------------------------------------------------------------------------------- /src/org/jruby/ant/RakeTaskBase.java: -------------------------------------------------------------------------------- 1 | package org.jruby.ant; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import org.apache.tools.ant.BuildException; 7 | import org.apache.tools.ant.Task; 8 | import org.jruby.embed.ScriptingContainer; 9 | 10 | public class RakeTaskBase extends Task { 11 | private Object rakeWrapper; 12 | private ScriptingContainer container; 13 | 14 | protected String filename; 15 | 16 | public RakeTaskBase() { 17 | acquireRakeReference(); 18 | } 19 | 20 | public void setFile(String filename) { 21 | this.filename = filename; 22 | } 23 | 24 | @Override 25 | public void execute() throws BuildException { 26 | container.put("$project", getProject()); // set project so jruby ant lib gets it 27 | } 28 | 29 | protected void acquireRakeReference() { 30 | System.setProperty("jruby.native.enabled", "false"); // Problem with cl w/ jnr + jffi 31 | container = new ScriptingContainer(); 32 | 33 | // FIXME: This needs to be replaced by something which does not assume CWD 34 | container.setLoadPaths(Arrays.asList("lib")); 35 | container.runScriptlet("require 'ant/tasks/raketasks'"); 36 | 37 | rakeWrapper = container.runScriptlet("RakeWrapper.new"); 38 | } 39 | 40 | protected List handleFilenameArgument() { 41 | List args = new ArrayList(); 42 | 43 | if (filename != null) { 44 | args.add("-f"); 45 | args.add(filename); 46 | } 47 | 48 | return args; 49 | } 50 | 51 | public void rakeMethod(String method, Object... args) throws BuildException { 52 | try { 53 | container.callMethod(rakeWrapper, method, args); 54 | } catch(Exception e) { 55 | throw new BuildException("Build failed: " + e.getMessage(), e); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Purpose of this project: 2 | Seamless integration between Rake and Ant environments. 3 | 4 | Quick Start: 5 | To run examples cd into samples and do a command-line like: 6 | 7 | jruby -I../lib simple_compile.rb 8 | 9 | Also the top-level Rakefile also uses these features to build the 10 | ant tasks so just running 'jruby -S rake' will use the ant features. 11 | 12 | Lastly, if you want to play with the task, you can run ant 13 | itself in the project directory: 14 | 15 | CLASSPATH=lib/jruby-complete.jar ant call-rakefile-setup 16 | CLASSPATH=lib/jruby-complete.jar ant call-rakefile 17 | 18 | The first example calls a low-level task in the Rakefile called setup. 19 | The second example calls default which will end up calling compile. This 20 | example is a little more trippy than the others since it is actually using 21 | ant tasks to run javac. 22 | 23 | As should be apparent in the previous examples, you need a copy of jruby- 24 | complete.jar to run these targets. Put it into the project lib dir. 25 | 26 | More info: 27 | 1. Allow Rakefiles to call ant tasks 28 | ant.java(:classname => "org.hsqldb.util.DatabaseManager", :fork => "yes") do 29 | classpath :refid => "project.class.path" 30 | arg :value => "-driver" 31 | arg :value => "org.hsqldb.jdbcDriver" 32 | arg :value => "-url" 33 | arg :value => "jdbc:hsqldb:#{data_dir}/music" 34 | arg :value => "-user" 35 | arg :value => "sa" 36 | end 37 | 38 | 2. Allow Rakefiles to be executed from ant. The first task is merely 39 | a callout task: 40 | 41 | 42 | 43 | 44 | 45 | This just runs a rakefile and executes a Rake task. If you omit the optional 46 | parameters then it will use the file 'Rakefile' and the task 'default'. 47 | 48 | The second task allows you to import all your rake tasks as ant targets. 49 | This allows you to mix and match between ant targets and rake tasks using 50 | ants target dependency management: 51 | 52 | 53 | 54 | If your ant build.xml has compile and it depends on setup and setup is 55 | defined in your Rakefile then compile will call setup as a dependency. 56 | 57 | 3. The same as number 2, but the other direction: 58 | ant_import 'build.xml' 59 | ant 'build'xml' 60 | 61 | -------------------------------------------------------------------------------- /lib/ant/element.rb: -------------------------------------------------------------------------------- 1 | require 'java' 2 | 3 | java_import org.apache.tools.ant.IntrospectionHelper 4 | java_import org.apache.tools.ant.RuntimeConfigurable 5 | java_import org.apache.tools.ant.UnknownElement 6 | 7 | # This is really the metadata of the element coupled with the logic for 8 | # instantiating an instance of an element and evaluating it. My intention 9 | # is to decouple these two pieces. This has extra value since we can then 10 | # also make two types of instances for both top-level tasks and for targets 11 | # since we have some conditionals which would then be eliminated 12 | class Element 13 | attr_reader :name 14 | 15 | def initialize(ant, name, clazz) 16 | @ant, @name, @clazz = ant, name, clazz 17 | end 18 | 19 | def call(parent, args={}, &code) 20 | element = create parent 21 | assign_attributes element, args 22 | define_nested_elements element 23 | code.arity==1 ? code[element] : element.instance_eval(&code) if block_given? 24 | if parent.respond_to? :get_owning_target # Task 25 | @ant.project.log "Adding #{name} to #{parent.component_name}", 5 26 | parent.add_child element 27 | parent.runtime_configurable_wrapper.add_child element.runtime_configurable_wrapper 28 | else # Target 29 | @ant.project.log "Executing #{name}", 5 30 | element.maybe_configure 31 | element.execute 32 | end 33 | end 34 | 35 | private 36 | def create(parent) # See ProjectHelper2.ElementHelper 37 | UnknownElement.new(@name).tap do |e| 38 | e.project = @ant.project 39 | e.task_name = @name 40 | end 41 | end 42 | 43 | # This also subsumes configureId to only have to traverse args once 44 | def assign_attributes(instance, args) 45 | @ant.project.log "instance.task_name #{instance.task_name} #{name}", 5 46 | wrapper = RuntimeConfigurable.new instance, instance.task_name 47 | args.each do |key, value| 48 | # FIXME: Infinite recursion and only single expression expansion 49 | while value =~ /\$\{([^\}]+)\}/ 50 | value.gsub!(/\$\{[^\}]+\}/, @ant.project.get_property($1).to_s) 51 | end 52 | wrapper.set_attribute key, value 53 | end 54 | end 55 | 56 | def define_nested_elements(instance) 57 | meta_class = class << instance; self; end 58 | @helper = IntrospectionHelper.get_helper(@ant.project, @clazz) 59 | @helper.get_nested_element_map.each do |element_name, clazz| 60 | element = @ant.acquire_element(element_name, clazz) 61 | meta_class.send(:define_method, element_name) do |*args, &block| 62 | element.call(instance, *args, &block) 63 | end 64 | end 65 | end 66 | end 67 | -------------------------------------------------------------------------------- /nbproject/project.properties: -------------------------------------------------------------------------------- 1 | application.title=akakamiari 2 | application.vendor=enebo 3 | build.classes.dir=${build.dir}/classes 4 | build.classes.excludes=**/*.java,**/*.form 5 | # This directory is removed when the project is cleaned: 6 | build.dir=build 7 | build.generated.dir=${build.dir}/generated 8 | build.generated.sources.dir=${build.dir}/generated-sources 9 | # Only compile against the classpath explicitly listed here: 10 | build.sysclasspath=ignore 11 | build.test.classes.dir=${build.dir}/test/classes 12 | build.test.results.dir=${build.dir}/test/results 13 | # Uncomment to specify the preferred debugger connection transport: 14 | #debug.transport=dt_socket 15 | debug.classpath=\ 16 | ${run.classpath} 17 | debug.test.classpath=\ 18 | ${run.test.classpath} 19 | # This directory is removed when the project is cleaned: 20 | dist.dir=dist 21 | dist.jar=${dist.dir}/akakamiari.jar 22 | dist.javadoc.dir=${dist.dir}/javadoc 23 | endorsed.classpath= 24 | excludes=java_build/**, java_src/**, simple_compile.jar 25 | file.reference.akakamiari-lib=lib 26 | file.reference.akakamiari-samples=samples 27 | file.reference.akakamiari-src=src 28 | file.reference.ant.jar=../apache-ant-1.7.1/build/lib/ant.jar 29 | file.reference.jruby-complete.jar=lib/jruby-complete.jar 30 | includes=** 31 | jar.compress=false 32 | javac.classpath=\ 33 | ${file.reference.jruby-complete.jar}:\ 34 | ${file.reference.ant.jar} 35 | # Space-separated list of extra javac options 36 | javac.compilerargs= 37 | javac.deprecation=false 38 | javac.source=1.5 39 | javac.target=1.5 40 | javac.test.classpath=\ 41 | ${javac.classpath}:\ 42 | ${build.classes.dir}:\ 43 | ${libs.junit.classpath}:\ 44 | ${libs.junit_4.classpath} 45 | javadoc.additionalparam= 46 | javadoc.author=false 47 | javadoc.encoding=${source.encoding} 48 | javadoc.noindex=false 49 | javadoc.nonavbar=false 50 | javadoc.notree=false 51 | javadoc.private=false 52 | javadoc.splitindex=true 53 | javadoc.use=true 54 | javadoc.version=false 55 | javadoc.windowtitle= 56 | jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api" 57 | lib.dir=${file.reference.akakamiari-lib} 58 | main.class= 59 | manifest.file=manifest.mf 60 | meta.inf.dir=${src.dir}/META-INF 61 | platform.active=default_platform 62 | run.classpath=\ 63 | ${javac.classpath}:\ 64 | ${build.classes.dir} 65 | # Space-separated list of JVM arguments used when running the project 66 | # (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value 67 | # or test-sys-prop.name=value to set system properties for unit tests): 68 | run.jvmargs= 69 | run.test.classpath=\ 70 | ${javac.test.classpath}:\ 71 | ${build.test.classes.dir} 72 | samples.dir=${file.reference.akakamiari-samples} 73 | source.encoding=UTF-8 74 | src.dir=${file.reference.akakamiari-src} 75 | -------------------------------------------------------------------------------- /lib/ant/ant.rb: -------------------------------------------------------------------------------- 1 | require 'java' 2 | require 'ant/element' 3 | require 'ant/target' 4 | 5 | java_import org.apache.tools.ant.ComponentHelper 6 | java_import org.apache.tools.ant.DefaultLogger 7 | java_import org.apache.tools.ant.Project 8 | java_import org.apache.tools.ant.Target 9 | 10 | class Ant 11 | attr_reader :project 12 | 13 | def initialize(options={}, &block) 14 | @options = options 15 | @project = create_project options 16 | initialize_elements 17 | end 18 | 19 | def create_project(options) 20 | # If we are calling into a rakefile from ant then we already have a project to use 21 | return $project if $project 22 | 23 | Project.new.tap do |p| 24 | p.init 25 | p.add_build_listener(DefaultLogger.new.tap do |log| 26 | log.output_print_stream = java.lang.System.out 27 | log.error_print_stream = java.lang.System.err 28 | log.emacs_mode = true 29 | log.message_output_level = options[:output_level] || 2 30 | end) 31 | end 32 | end 33 | 34 | # Add a target (two forms) 35 | # 1. Execute a block as a target: add_target "foo-target" { echo :message => "I am cool" } 36 | # 2. Execute a rake task as a target: add_target Rake.application["default"] 37 | def add_target(task, &block) 38 | target = block_given? ? BlockTarget.new(self, task, &block) : RakeTarget.new(self, task) 39 | @project.add_target target 40 | end 41 | 42 | def execute_target(name) 43 | @project.execute_target(name) 44 | end 45 | 46 | # We generate top-level methods for all default data types and task definitions for this instance 47 | # of ant. This eliminates the need to rely on method_missing. 48 | def initialize_elements 49 | @elements = {} 50 | @helper = ComponentHelper.get_component_helper @project 51 | generate_children @project.data_type_definitions 52 | generate_children @project.task_definitions 53 | end 54 | 55 | # All elements (including nested elements) are registered so we can access them easily. 56 | def acquire_element(name, clazz) 57 | element = @elements[name] 58 | return element if element 59 | 60 | # Not registered in ant's type registry for this project (nested el?) 61 | unless @helper.get_definition(name) 62 | @project.log "Adding #{name} -> #{clazz.inspect}", 5 63 | @helper.add_data_type_definition(name, clazz) 64 | end 65 | 66 | @elements[name] = :give_it_something_to_prevent_endless_recursive_defs 67 | @elements[name] = Element.new(self, name, clazz) 68 | end 69 | 70 | def generate_children(collection) 71 | collection.each do |name, clazz| 72 | element = acquire_element(name, clazz) 73 | self.class.send(:define_method, name) do |*a, &b| 74 | element.call(@current_target, *a, &b) 75 | end 76 | end 77 | end 78 | 79 | class << self 80 | def ant(options={}, &code) 81 | @ant ||= Ant.new options 82 | code.arity==1 ? code[@ant] : @ant.instance_eval(&code) if block_given? 83 | @ant 84 | end 85 | end 86 | end 87 | 88 | def ant(*args, &block) 89 | Ant.ant(*args, &block) 90 | end 91 | 92 | def ant_import(filename = 'build.xml') 93 | # FIXME: Implement this 94 | end 95 | -------------------------------------------------------------------------------- /nbproject/build-impl.xml: -------------------------------------------------------------------------------- 1 | 2 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | Must set src.dir 166 | Must set lib.dir 167 | Must set samples.dir 168 | Must set build.dir 169 | Must set dist.dir 170 | Must set build.classes.dir 171 | Must set dist.javadoc.dir 172 | Must set build.test.classes.dir 173 | Must set build.test.results.dir 174 | Must set build.classes.excludes 175 | Must set dist.jar 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | Must set javac.includes 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | Must select some files in the IDE or set javac.includes 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | To run this application from the command line without Ant, try: 462 | 463 | 464 | 465 | 466 | 467 | 468 | java -cp "${run.classpath.with.dist.jar}" ${main.class} 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | To run this application from the command line without Ant, try: 492 | 493 | java -jar "${dist.jar.resolved}" 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | Must select one file in the IDE or set run.class 559 | 560 | 561 | 562 | Must select one file in the IDE or set run.class 563 | 564 | 565 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | Must select one file in the IDE or set debug.class 590 | 591 | 592 | 593 | 594 | Must select one file in the IDE or set debug.class 595 | 596 | 597 | 598 | 599 | Must set fix.includes 600 | 601 | 602 | 603 | 604 | 605 | 606 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | Must select some files in the IDE or set javac.includes 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | Some tests failed; see details above. 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | Must select some files in the IDE or set test.includes 696 | 697 | 698 | 699 | Some tests failed; see details above. 700 | 701 | 702 | 707 | 708 | Must select one file in the IDE or set test.class 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 738 | 739 | Must select one file in the IDE or set applet.url 740 | 741 | 742 | 743 | 744 | 745 | 746 | 751 | 752 | Must select one file in the IDE or set applet.url 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | --------------------------------------------------------------------------------