I am working on my first non-trivial Java app. It was started by a co-worker, but she didn't have time to finish, so I took it over. I decided to use Buildr as my build tool: https://buildr.apache.org/
First, to start with empty target directories, I do:
buildr clean
Then I:
buildr --verbose compile
which gives me:
(in /Users/cerhov/projects/openz/lofdg/buildr_fdg, development)
Compiling buildr_fdg
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
cp /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/resources/com/company/students.txt /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company/students.txt
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
cp /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/resources/com/company/scores.txt /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company/scores.txt
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
cp /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/resources/com/company/behavior.txt /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company/behavior.txt
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
cp /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/resources/com/company/schoolDates.txt /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company/schoolDates.txt
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company
cp /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/resources/com/company/assignments.txt /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources/com/company/assignments.txt
touch /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/resources
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/classes
Compiling buildr_fdg into /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/classes
Note: /Users/cerhov/projects/openz/lofdg/buildr_fdg/src/main/java/com/company/Main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
touch /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/classes
Completed in 0.926s
This gives me my ".class" files. Now I want to package this up as a jar, so I:
cerhov : 15:26:04 : ~/projects/openz/lofdg/buildr_fdg $ buildr --verbose package
which gives me:
(in /Users/cerhov/projects/openz/lofdg/buildr_fdg, development)
Building buildr_fdg
Packaging buildr_fdg
Packaging buildr_fdg-1.0.0.jar
rm /Users/cerhov/projects/openz/lofdg/buildr_fdg/target/buildr_fdg-1.0.0.jar
mkdir -p /Users/cerhov/projects/openz/lofdg/buildr_fdg/target
Running integration tests...
Completed in 0.212s
Then I do this:
cerhov : 15:26:56 : ~/projects/openz/lofdg/buildr_fdg $ ls target/
and I see a new Jar file has been created:
buildr_fdg-1.0.0.jar classes resources
so I:
java -jar target/buildr_fdg-1.0.0.jar
but I get:
Error: An unexpected error occurred while trying to open file target/buildr_fdg-1.0.0.jar
I'd like to get more info so I wrapped my whole main() function in a big try/catch statement:
public static void main(String[] args) {
try {
// all my real code goes here, but I have deleted it for clarity
} catch (Exception e) {
e.printStackTrace();
}
}
Then I re-compiled and re-packaged, but I still get the same error. I am unclear how I can force the app to give me more info.
I wanted to see if my manifest.txt got into my jar, so I copied the jar to another folder, cd'ed to that folder, and:
jar xf buildr_fdg-1.0.0.jar
and then this:
cat META-INF/MANIFEST.MF
showed me:
Created-By: Buildr
:
Manifest-Version: 1.0
Main-Class: com/company/Main
Which looks right. Maybe I can add in a classpath, though Buildr seems to have found all the files.
How do I force the app to give me more information about the problem?
UPDATE:
I tried adding this line to the manifest:
Class-Path: /Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/main/java/com/company
Then I re-compiled and re-packaged. But this:
java -cp buildr_fdg-1.0.0.jar com.company.Main
gave me:
Error: Could not find or load main class com.company.Main
So I tried every variation:
/Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/main/java/com/
/Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/main/java/
/Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/main/
/Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/
/Users/cerhov/projects/launchopen/lofdg/buildr_fdg/
None of which work. Am I suppose to aim the classpath at the source directory or the target directory?
Why is Buildr unable to manage this for me? It does find all of the files and it does bundle them all into the jar, so it knows where everything is.
I recreated the problem and was able to correct it by manually removing the colon (:) that appears by itself in the manifest file. Don't know why buildr is putting it there. This describes a way of possibly overriding the manifest file in buildr: https://buildr.apache.org/rdoc/Buildr/Packaging/Java/JarTask.html My reputation is too low to post a comment so unfortunately I can only post it as an answer. Hopefully this helps.