javajarbuildr

Can I try/catch this error: "An unexpected error occurred while trying to open jar"


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.


Solution

  • 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.