【问题标题】:package and run sample application as a JAR with Netbeans使用 Netbeans 将示例应用程序打包并运行为 JAR
【发布时间】:2015-06-27 17:39:25
【问题描述】:

我要编译打包这个示例代码:

thufir@dur:~/NetBeansProjects/HelloAsterisk/src$
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$ javac -cp
asterisk-java.jar ExampleCallIn.java
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$ java -cp
asterisk-java.jar org.asteriskjava.fastagi.DefaultAgiServer Apr 20, 2015
12:19:20 PM org.asteriskjava.fastagi.DefaultAgiServer startup INFO:
Listening on *:4573.
^Cthufir@dur:~/NetBeansProjects/HelloAsterisk/src$
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$ ls asterisk-java.jar 
ExampleCallIn.class  ExampleCallIn.java fastagi-mapping.properties
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$ cat ExampleCallIn.java
import org.asteriskjava.fastagi.AgiChannel;
import org.asteriskjava.fastagi.AgiException;
import org.asteriskjava.fastagi.AgiRequest;
import org.asteriskjava.fastagi.BaseAgiScript;

public class ExampleCallIn extends BaseAgiScript {

     @Override public void service(AgiRequest request, AgiChannel channel)
     throws
AgiException {
         answer();
         exec("Playback", "tt-monkeys");
         hangup();
     }
}
thufir@dur:~/NetBeansProjects/HelloAsterisk/src$

在 Netbeans 中。但是,没有主要课程。当我在 Netbeans 中将其构建为 JAR 时:

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ ll
total 568
drwxrwxr-x 3 thufir thufir   4096 Apr 20 12:57 ./
drwxrwxr-x 6 thufir thufir   4096 Apr 20 12:57 ../
-rw-rw-r-- 1 thufir thufir 562907 Apr 20 12:57 HelloAsterisk.jar
drwxrwxr-x 2 thufir thufir   4096 Apr 20 12:57 lib/
-rw-rw-r-- 1 thufir thufir   1328 Apr 20 12:57 README.TXT
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ ll lib/
total 560
drwxrwxr-x 2 thufir thufir   4096 Apr 20 12:57 ./
drwxrwxr-x 3 thufir thufir   4096 Apr 20 12:57 ../
-rw-rw-r-- 1 thufir thufir 561237 Apr 20 12:57 asterisk-java-1.0.0.jar
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ jar -tf HelloAsterisk.jar 
META-INF/
META-INF/MANIFEST.MF
ExampleCallIn.class
asterisk-java.jar
fastagi-mapping.properties
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ java -jar HelloAsterisk.jar 
Error: Could not find or load main class helloasterisk.HelloAsterisk
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 

与 MANIFEST.MF 一样:

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ jar -xf HelloAsterisk.jar 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.7.0_75-b13 (Oracle Corporation)
Class-Path: lib/asterisk-java-1.0.0.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: helloasterisk.HelloAsterisk

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 

如何构建和打包此示例代码,以便将其打包为使用java -jar 命令运行的 JAR?

我有理由确定清单需要修改。或者,也许,当使用java -jar 执行时,应该传递一些 CLI 选项?

首选的解决方案是自定义清单,以便我可以按 IDE 中的“运行”按钮来运行 JAR。

----------------------------------- ----------------------------------更新

对不起,上面有个jar里面有个jar是因为src目录下有个jar文件。删除那个罐子给出:

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ java -jar HelloAsterisk.jar 
Error: Could not find or load main class helloasterisk.HelloAsterisk
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ ls lib/
asterisk-java-1.0.0.jar
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ jar -tf HelloAsterisk.jar 
META-INF/
META-INF/MANIFEST.MF
ExampleCallIn.class
fastagi-mapping.properties
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ jar -xf HelloAsterisk.jar 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 
thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.7.0_75-b13 (Oracle Corporation)
Class-Path: lib/asterisk-java-1.0.0.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: helloasterisk.HelloAsterisk

thufir@dur:~/NetBeansProjects/HelloAsterisk/dist$ 

来自这个组织,清单应该是什么样的?有一个用Class-Path: lib/asterisk-java-1.0.0.jar 指定的jar。

请记住,从 CLI 执行 .class 文件时,没有主类!

另见:

http://article.gmane.org/gmane.comp.telephony.pbx.asterisk.java/18

【问题讨论】:

    标签: java netbeans jar manifest javac


    【解决方案1】:

    Jar 文件不得嵌入到其他 jar 文件中。那是行不通的。 有了清单,结构必须是

    some-folder
        HelloAsterisk.jar 
        lib
           asterisk-java-1.0.0.jar
    

    然后,有了一些文件夹,你就可以运行了

    java -jar HelloAsterisk.jar
    

    (假设 helloasterisk.HelloAsterisk 类确实存在于这两个 jar 之一中)。

    【讨论】:

    • 我很抱歉。我在src 目录中有asterisk-java-1.0.0.jar,而Netbeans 正在挑选它,所以它包含在HelloAsterisk.jar 中,导致jar in a jar 问题。 这完全是红鲱鱼。 问题是没有主类,但程序执行。如何?我更新了问题以尝试反映这一点。我想执行 Netbeans 构建的 JAR,它使用 lib 目录和依赖项。
    • 现在我完全糊涂了。你的问题到底是什么?执行哪个程序?如果这不是您的主要课程,您为什么要将 Main-Class: helloasterisk.HelloAsterisk 添加到清单中?
    • 我的错误。我跑错了。您可以运行 Java API。然后是示例类。可怕的问题。
    猜你喜欢
    • 2011-01-11
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多