最近搞打包一头雾水,有几个问题1.是不是manifest里的Main-Class只能有一个?2.如果1的答案是Yes,那么如何通过Jar文件去调用其他的类?Classpath怎么写?3.如果1的答案是Yes,请问如果用Ant生成jar文件,怎么把其他Main方法声明出来?3.请问如果打包时需要Manifest,是怎么写命令法?4.如果吧lib的jar包放在外部,是不是写 jar -cf的时候,lib的jar文件必须就位?如果当时还没生成,怎么办?
全分附上,抱歉只有这么多了请大家指点,谢谢

解决方案 »

  1.   

    1.是
    2.java -classpath "jar引用路径" 主函数入口
    3.不解?? main只有一个起作用
    4.google之
    5.jar加载路径的文件,存在的话会加载,不存在会被忽略
      

  2.   

    谢谢两位回复抱歉我忘记说我要做的类似是 JMS 类的东西,有sender 和receiver,各自都有main方法,现在要必须只能用一个jar文件包括所有,用外部的config文件和命令行(也就是如何运行jar文件)去调用sender或者receiver。但是现在有点乱,不是太有头绪。因为无论如何jar里面都只有一个main类。但是好像听说也有共存的方法(就是其它的Main方法也可以调用)请各位继续指点,谢谢了
      

  3.   

    假设a.jar里有test1.class test2.class分别有一个main函数
    执行test1
    java -classpath "a.jar" test1执行test2
    java -classpath "a.jar" test2
      

  4.   

    谢谢,可我一用java -classpath "a.jar" test1这种调用方式就告诉我找不到类但是用jar -tf a.jar 看到里面是有的我把ant的build的compile那块放这里来了,里面应该有关。请给看看,谢谢<target name="compile" depends="prepare,clean">
    <javac srcdir="${src.dir}" destdir="${build.classes}">
    <include name="com/jms/sub/*.java"/>
    <classpath refid="compile.classpath"/>
    </javac>
    </target>
    <!--task javadoc-->
    <target name="javadoc">
    <mkdir dir="${doc.dir}/api"/>
    <javadoc packagenames="com." sourcepath="${src.dir}" destpath="${doc.dir}/api" classpathref="classpath"/>
    </target>
    <!--task jar-->
    <target name="jar" depends="prepare,compile">
    <jar basedir="${build.classes}" destfile="${dist.dir}/pubsub.jar">
    <!-- set mainfest information to manifest -->  
                <manifest>  
                    <attribute name="Implementation-Maker" value="tian.yu" />  
                    <attribute name="Implementation-Time" value="${touch.time}" />  
                    <attribute name="Class-Path" value="${libs.project}" />
                    <attribute name="Main-Class" value="com.jms.sub.TibcoSubscriber" />
                </manifest> 
    </jar>
      

  5.   

    汗...路径写全...写给你只是示意...你不会就这么写了吧...
    java -classpath "jar引用路径" com.jms.sub.TibcoSubscriber
      

  6.   

    你应该分别complie main 然后用ant打包到一起
      

  7.   

    打包成jar文件,需要指定一个入口类,即主main程序,只能有一个。这个主main程序需要写全路径名,按着这个类路径,肯定只能找到一个入口启动这个程序。
      

  8.   

    java -jar a.jar com/..../ClassName
      

  9.   

    谢谢各位现在找不到类是找不到javax/jms/JMSException, 我的java代码里是会throw JMSException的
    是不是没找到lib的jar文件呢?
    javax/jms/JMSException
    E:\workspace\eclipse_EE\Codes\PubSub_Server>java -classpath "pubsub.jar" com.jms.
    sub.TibcoSubscriberTransacted fusionRealTimeSubscriberTransacted.proper ties Exce
    ption in thread "main" java.lang.NoClassDefFoundError: javax/jms/JMSExceptionCaused by: java.lang.ClassNotFoundException: javax.jms.JMSException
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
    Could not find the main class: com.jms.sub.TibcoSubscriberTransacted.  Program w
    ill exit.
      

  10.   

    打包的时候外部jar是不会被一起打包的。可以有2种解决办法:
    1:使用命令导入外部jar  
       java -jar -Djava.ext.dirs=外部jar路径 需要运行的jar
    比如我们将Lib目录与我们的test.jar放入同级目录中。那么
    java -jar -Djava.ext.dirs=lib test.jar 2:使用build fat jar 打包,这样外部Jar就会被打包好了。就可以直接用jar -jar test.jar来运行了。至于build fat jar 请看这里...http://hi.baidu.com/tedzhangzhe/blog/item/0d10a23860bce83596ddd877.html