That would be great... from an engineering perspective I agree. It would be very
simple to filter a property file.

But in business everything doesn't always make engineering sense.

Our business has political reasons (that are out of my control as an engineer) for having this information substituted into and compiled from a source file.

The best solution I've come up with so far is create a temporary copy of the original source file, filter that copy, copy the filtered version over the location of the original source, and finally restore the original after the compilation is complete.



In trying this approach, I am running into an issue.

I need to perform my filter before I build my sub-project, but restore it right after
the build task is done.

From the documentation it looks like I can set a variable to a task and call build on the variable to run the task before the build task. To run code after the build I simply
define a build block... so I essentially have this:


define  'root' do

  define 'othersubproject1' do
  end


  define 'subproject' do

      pre_build_task = task do
        puts "this should print BEFORE compiling"
        # filtering of source file happens here
      end

      # this should run pre-build
      build pre_build_task

      # this should run post-build
      build do
        puts "this should print AFTER compiling"
        # restoration of source file happens here
      end

  end


  define 'othersubproject2' do
  end

end



I don't know if this is a buildr bug or not, but if I run the following in my subproject:

$  cd root/subproject
$  buildr clean build package

the output and order of things is like this:

Cleaning root:subproject
Building root:subproject
this should print BEFORE compiling
Compiling root:subproject into <dir-to-project>/root/subproject/target/ classes Compiling root:subproject into <dir-to-project>/root/subproject/target/ test/classes
Skipping tests for root:subproject
this should print AFTER compiling
Packaging root:subproject


And it works that way! I can see the source file get filtered, compiled, then reverted.
However... when I run from the root of my project:

$  cd root/
$  buildr clean build package

the output and order of things is like the following:

Cleaning root
Building root
Compiling root:othersubproject1 into <dir-to-project>/root/ othersubproject1/target/classes
Skipping tests for root:othersubproject1
Compiling root:subproject into <dir-to-project>/root/subproject/target/ classes
this should print BEFORE compiling
Compiling root:subproject:test <dir-to-project>/root/subproject/target/ test/classes
Skipping tests for root:subproject
this should print AFTER compiling
Compiling root:othersubproject2 into <dir-to-project>/root/ othersubproject2/target/classes
Skipping tests for root:othersubproject2
Skipping tests for root
Packaging root


When building the root project (or from the root project) the task I'm wanting to have happen before the root:subproject gets compiled doesn't happen... it happens after compiling instead.

Is this a bug? Am I doing something wrong here?

Thanks for your help!

~ Andrew Moore













On Nov 25, 2008, at 5:30 PM, Alexis Midon wrote:

First, why about externalizing these values in a property file and making
your java class reads this file. So you don't have to worry about
overwriting the java class.

Then in the buildfile you create a rake task that dumps the property file
every time you package for instance.

something like:

desc "my killer app"
define "app" do
    package(:jar).enhance do |task|
File.open(path_to(:target,:classes,"build.properties"), 'w') do |io|
           io.puts "build.version=#{project.version}"
       end
    end
end


Alexis


On Tue, Nov 25, 2008 at 1:05 PM, rp.andrew.moore
<[EMAIL PROTECTED]>wrote:


We want to compile our version, build, time of compilation, location of
compilation, and other information into a java class that our web app
references (this way we can check the info online while it's running, and know that it can't be inadvertantly changed in properties, xml or manifest
file)

How do I do that before building it?

For example, our java file has pretty simple variables where the filter
needs to be applied:

from the myproject/src/main/java/com/example/info/Info.java file:

private static final String APPLICATION_VERSION = "$ {APP_VERSION}"; //
Substituted by the build
private static final String BUILD_NUMBER = "$ {BUILD_NUMBER}"; //
Substituted by the build
private static final String BUILD_TIMESTAMP = "$ {BUILD_TIMESTAMP}"; //
Substituted by the build


How do I apply a filter so that when I build "myproject", the values are updated prior to compilation, yet the original java file isn't written over
so that I can repeat it over and over again?

Thanks!

~ Andrew




--
View this message in context:
http://n2.nabble.com/How-do-I-repeatably-filter-a-java-file-before-it-is-compiled--tp1578216p1578216.html
Sent from the Apache Buildr - User mailing list archive at Nabble.com.



Reply via email to