技术开发 频道

关于JAR您不知道的5件事

  2. JAR 可以包括依赖关系信息

  似乎 Hello 实用工具已经展开,改变实现的需求已经出现。Spring 或 Guice 这类依赖项注入(DI)容器可以为我们处理许多细节,但是仍然有点小问题:修改代码使其含有 DI 容器的用法可能导致清单 4 所示的结果,如:

  清单 4. Hello、Spring world!

package com.tedneward.jars;

import org.springframework.context.
*;
import org.springframework.context.support.
*;

public class Hello
{
    
public static void main(String[] args)
    {
        ApplicationContext appContext
=
            
new FileSystemXmlApplicationContext("./app.xml");
        ISpeak speaker
= (ISpeak) appContext.getBean("speaker");
        System.out.println(speaker.sayHello());
    }
}

  由于启动程序的 -jar 选项将覆盖 -classpath 命令行选项中的所有内容,因此运行这些代码时,Spring 必须是在 CLASSPATH 和 环境变量中。幸运的是,JAR 允许在清单文件中出现其他的 JAR 依赖项声明,这使得无需声明就可以隐式创建 CLASSPATH,如清单 5 所示:

  清单 5. Hello、Spring CLASSPATH!

<target name="jar" depends="build">
        
<jar destfile="outapp.jar" basedir="classes">
            
<manifest>
                
<attribute name="Main-Class" value="com.tedneward.jars.Hello" />
                
<attribute name="Class-Path"
                    value
="./lib/org.springframework.context-3.0.1.RELEASE-A.jar
                      ./lib/org.springframework.core-3.0.1.RELEASE-A.jar
                      .
/lib/org.springframework.asm-3.0.1.RELEASE-A.jar
                      .
/lib/org.springframework.beans-3.0.1.RELEASE-A.jar
                      .
/lib/org.springframework.expression-3.0.1.RELEASE-A.jar
                      .
/lib/commons-logging-1.0.4.jar" />
            </manifest>
        
</jar>
    
</target>
 

  注意 Class-Path 属性包含一个与应用程序所依赖的 JAR 文件相关的引用。您可以将它写成一个绝对引用或者完全没有前缀。这种情况下,我们假设 JAR 文件同应用程序 JAR 在同一个目录下。

  不幸的是,value 属性和 Ant Class-Path 属性必须出现在同一行,因为 JAR 清单文件不能处理多个 Class-Path 属性。因此,所有这些依赖项在清单文件中必须出现在一行。当然,这很难看,但为了使 java -jar outapp.jar 可用,还是值得的!

0
相关文章