我正在研究我的第一个非平凡的Java应用程序。它是由一位同事创办的,但她没有时间完成,所以我接手了。我决定使用Buildr作为我的构建工具:https://buildr.apache.org/
首先,从空目标目录开始,我这样做:
buildr clean
然后我:
buildr --verbose compile
给了我:
(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
这给了我“.class”文件。现在我想将它打包成一个罐子,所以我:
cerhov : 15:26:04 : ~/projects/openz/lofdg/buildr_fdg $ buildr --verbose package
给了我:
(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
然后我这样做:
cerhov : 15:26:56 : ~/projects/openz/lofdg/buildr_fdg $ ls target/
我看到一个新的Jar文件已经创建:
buildr_fdg-1.0.0.jar classes resources
所以我:
java -jar target/buildr_fdg-1.0.0.jar
但我明白了:
Error: An unexpected error occurred while trying to open file target/buildr_fdg-1.0.0.jar
我想获得更多信息,所以我将整个main()函数包装在一个大的try / catch语句中:
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();
}
}
然后我重新编译并重新打包,但我仍然得到同样的错误。我不清楚如何强制该应用程序给我更多信息。
我想知道我的manifest.txt是否进入我的jar,所以我将jar复制到另一个文件夹,cd到了该文件夹,然后:
jar xf buildr_fdg-1.0.0.jar
然后这个:
cat META-INF/MANIFEST.MF
告诉我:
Created-By: Buildr
:
Manifest-Version: 1.0
Main-Class: com/company/Main
哪个看起来正确。也许我可以添加一个类路径,虽然Buildr似乎找到了所有文件。
如何强制该应用向我提供有关此问题的更多信息?
更新:
我尝试将此行添加到清单中:
Class-Path: /Users/cerhov/projects/launchopen/lofdg/buildr_fdg/src/main/java/com/company
然后我重新编译并重新打包。但是这个:
java -cp buildr_fdg-1.0.0.jar com.company.Main
给了我:
Error: Could not find or load main class com.company.Main
所以我尝试了各种变体:
/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/
这些都不起作用。我想将类路径瞄准源目录或目标目录?
为什么Buildr无法为我管理这个?它确实找到了所有文件,并将它们全部捆绑到jar中,因此它知道一切都在哪里。
答案 0 :(得分:2)
我重新创建了问题,并且能够通过手动删除清单文件中单独出现的冒号(:)来纠正它。不知道为什么buildr会把它放在那里。这描述了一种可能覆盖buildr中清单文件的方法:https://buildr.apache.org/rdoc/Buildr/Packaging/Java/JarTask.html我的声誉太低,无法发表评论,所以不幸的是我只能将其作为答案发布。希望这会有所帮助。
答案 1 :(得分:0)
看起来清单文件存在一些问题。一个是你有上面的kharyam提到的迷路':',另一个是Main-Class属性的格式不正确。它应该看起来像类名(即“Main-Class:com.company.Main”)。如果您可以发布定义包的构建文件的一部分,我们可以进一步提供帮助。