2010-05-09 96 views
1

我试图使用JCL使用下面的代码加载jar文件:类路径清单中被忽略

FileInputStream fis = new FileInputStream(new File("C:\\Users\\sunils\\glassfish-tests\\working\\test.jar")); 
     JarClassLoader jc = new JarClassLoader(); 
     jc.add(fis); 
     Class main = jc.loadClass("highmark.test.Main"); 
     String[] str={}; 

     main.getMethod("test").invoke(null);//.getDeclaredMethod("main",String[].class).invoke(null,str); 
     fis.close(); 

加载jar文件但是当我尝试运行这个程序,我得到异常的

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at Main.main(Main.java:21) 
Caused by: java.lang.RuntimeException: Embedded startup not found, classpath is probably incomplete 
    at org.glassfish.api.embedded.Server.<init>(Server.java:292) 
    at org.glassfish.api.embedded.Server.<init>(Server.java:75) 
    at org.glassfish.api.embedded.Server$Builder.build(Server.java:185) 
    at org.glassfish.api.embedded.Server$Builder.build(Server.java:167) 
    at highmark.test.Main.test(Main.java:33) 
    ... 5 more 

据此,它无法找到类,但是当我明确运行该jar文件它运行良好。好像JCL无视存在于JAR文件中的其他类,

MANIFEST.MF文件中的jar文件显示:

Manifest-Version: 1.0 
Class-Path: . 
Main-Class: highmark.test.Main 

好像被忽略Class-Path: .,这个jar文件运行正常,当我运行使用Java它明确地说,这只是一个测试,实际上这个jar文件是作为InputStream而来的,它不能存储在文件系统中,我怎样才能克服这个问题,有没有解决方法?

感谢您的任何帮助。

UNDATE: 这里是一个jar Main类:

package highmark.test; 
import org.glassfish.api.embedded.*; 

import java.io.*; 

import org.glassfish.api.deployment.*; 

    import com.sun.enterprise.universal.io.FileUtils; 
    public class Main { 
     public static void main(String[] args) throws IOException, LifecycleException, ClassNotFoundException { 
      test();  
     } 
     public static void test() throws IOException, LifecycleException, ClassNotFoundException{ 

     Server.Builder builder = new Server.Builder("test"); 

     Server server = builder.build(); 
     server.createPort(8080); 
     ContainerBuilder containerBuilder = server.createConfig(ContainerBuilder.Type.web); 
     server.addContainer(containerBuilder); 
     server.start(); 


     File war=new File("C:\\Users\\sunils\\maventests\\simple-webapp\\target\\simple-webapp.war");//(File) inputStream.readObject(); 
     EmbeddedDeployer deployer = server.getDeployer(); 
     DeployCommandParameters params = new DeployCommandParameters(); 
     params.contextroot = "simple"; 
     deployer.deploy(war, params); 
     } 
    } 
+0

怎样的'highmark.test.Main'看?具体来说,'test'方法是怎么样的? – aioobe 2010-05-09 13:27:38

+0

@aioobe:我更新了我的问题,我认为jar不是问题,因为它可以独立运行并运行良好 – Xinus 2010-05-09 13:53:15

回答

1

确保清单以换行符结束,或者最后一行可能无法正常解析。此外,如果您的jar文件不需要外部资源,则可能不需要指定类路径条目。如果外部jar文件和目录中有需要的资源,则可能只需指定一个类路径。下面是来自tutorials一个例子:

我们希望在MyUtils.jar加载类成在MyJar.jar使用的类路径。这两个JAR文件位于同一个目录中。

我们首先创建一个名为Manifest.txt包含以下内容的文本文件:

Class-Path: MyUtils.jar