2014-07-20 81 views
0

我正在处理我的第一个非平凡的Java应用程序。它是由一名同事创办的,但她没有时间完成,所以我接管了它。我决定使用Buildr作为我的生成工具:https://buildr.apache.org/我可以尝试/发现此错误:“尝试打开jar时发生意外错误”

首先,先从空的目标目录,我做的:

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 

so I:

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 

我想,所以我在一个大try/catch语句包裹着我的整个main()函数,以获得更多信息:

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到另一个文件夹,cd'ed到该文件夹​​,并且:

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似乎已经找到了所有的文件。

我该如何强制应用程序给我关于这个问题的更多信息?

UPDATE:

我尝试添加此行到清单:

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

在Main.java文件中是否有package语句?如果运行'java -cp buildr_fdg-1.0.0.jar com.company.Main',会发生什么? –

+0

Main.java中的包语句:“package com.company;” – cerhovice

+0

有趣。这个:“java -cp buildr_fdg-1.0.0.jar com.company.Main”给我: 错误:无法找到或加载主类com.company.Main – cerhovice

回答

2

我重新创建了该问题,并能够通过手动删除自身出现在清单文件中的冒号(:)来纠正该问题。不知道建筑商为什么把它放在那里。这描述了一种可能覆盖buildr中清单文件的方法:https://buildr.apache.org/rdoc/Buildr/Packaging/Java/JarTask.html我的声望太低而不能发表评论,所以不幸我只能将它作为答案发布。希望这有助于。

+0

删除冒号并手动构建jar,确实让我经历了一组问题(将我带到其他人)。 – cerhovice

0

它看起来像清单文件有几个问题。一个是你有一个流浪的':'如上面kharyam所提到的,另一个是Main-Class属性的格式不正确。它应该看起来像类名(即“Main-Class:com.company.Main”)。如果您可以发布定义该包的构建文件的一部分,我们可能会进一步提供帮助。

相关问题