UPDATE
It seems this is at least partly outdated, have a look at manifestclasspath
.
It is possible to define .jar
dependencies in the MANIFEST.MF
of the main .jar
file, it is just a comma seperated string which looks like this:
Class-Path: lib/log4j.jar lib/commons.jar
In a project I work on, we keep all our dependencies in a lib
directory, where we add and remove libraries from time to time,
therefore it would be nice if the above text can be generated
automatically. Fortunately, this is possible using just Ant
. Unfortunately, this is rather cumbersome. (If you want something more powerful and simpler to use, have a look at Rake
).
In a nutshell, this is how I did it:
- First, let’s define some properties:
-
-
<
property
name
=
"jar.name"
value
=
"ourjarfile.jar"
/>
-
-
-
<
property
name
=
"dist.home"
value
=
"dist"
/>
-
-
-
<
property
name
=
"build.home"
value
=
"target"
/>
-
-
-
<
property
name
=
"lib.home"
value
=
"lib"
/>
<!-- name of the output .jar file -->
<property name="jar.name" value="ourjarfile.jar" />
<!-- base directory for distribution target -->
<property name="dist.home" value="dist" />
<!-- base directory for compilation targets -->
<property name="build.home" value="target" />
<!-- The base directory for all libraries (jar) files -->
<property name="lib.home" value="lib" />
- Now to the fun part, create a nice .jar
file. This generates the MANIFEST.MF
but first generates a property libs.project
that contains all .jar
files, sperated with space. If you later look at the generated MANIFEST.MF
you will notice that the paths are wrapped every 72 character, even in
the middle of the word. Although this looks like an error, it works
correctly.
-
<
target
name
=
"jar"
depends
=
"compile"
description
=
"Create jar and MANIFEST.MF"
>
-
-
-
<
pathconvert
property
=
"libs.project"
pathsep
=
" "
>
-
<
mapper
>
-
<
chainedmapper
>
-
-
-
<
flattenmapper
/>
-
-
-
<
globmapper
from
=
"*"
to
=
"lib/*"
/>
-
</
chainedmapper
>
-
</
mapper
>
-
-
<
path
>
-
-
-
<
fileset
dir
=
"${lib.home}"
>
-
<
include
name
=
"**/*.jar"
/>
-
</
fileset
>
-
</
path
>
-
</
pathconvert
>
-
-
-
<
jar
jarfile
=
"${build.home}/${jar.name}"
basedir
=
"${build.home}/classes"
>
-
-
-
<
manifest
>
-
<
attribute
name
=
"Built-By"
value
=
"${user.name}"
/>
-
<
attribute
name
=
"Main-Class"
value
=
"my.path.to.the.main.Application"
/>
-
<
section
name
=
"common"
>
-
<
attribute
name
=
"Specification-Title"
value
=
"${component.name}"
/>
-
<
attribute
name
=
"Specification-Version"
value
=
"${component.version}"
/>
-
<
attribute
name
=
"Specification-Vendor"
value
=
"${component.vendor}"
/>
-
<
attribute
name
=
"Implementation-Title"
value
=
"${component.name}"
/>
-
<
attribute
name
=
"Implementation-Version"
value
=
"${component.version} ${TODAY}"
/>
-
<
attribute
name
=
"Implementation-Vendor"
value
=
"${component.vendor}"
/>
-
</
section
>
-
-
-
<
attribute
name
=
"Class-Path"
value
=
"${libs.project}"
/>
-
</
manifest
>
-
</
jar
>
-
</
target
>
<target name="jar" depends="compile" description="Create jar and MANIFEST.MF">
<!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->
<pathconvert property="libs.project" pathsep=" ">
<mapper>
<chainedmapper>
<!-- remove absolute path -->
<flattenmapper />
<!-- add lib/ prefix -->
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path>
<!-- lib.home contains all jar files, in several subdirectories -->
<fileset dir="${lib.home}">
<include name="**/*.jar" />
</fileset>
</path>
</pathconvert>
<!-- create the jar -->
<jar jarfile="${build.home}/${jar.name}" basedir="${build.home}/classes">
<!-- define MANIFEST.MF -->
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Main-Class" value="my.path.to.the.main.Application" />
<section name="common">
<attribute name="Specification-Title" value="${component.name}" />
<attribute name="Specification-Version" value="${component.version}" />
<attribute name="Specification-Vendor" value="${component.vendor}" />
<attribute name="Implementation-Title" value="${component.name}" />
<attribute name="Implementation-Version" value="${component.version} ${TODAY}" />
<attribute name="Implementation-Vendor" value="${component.vendor}" />
</section>
<!-- finally, use the magically generated libs path -->
<attribute name="Class-Path" value="${libs.project}" />
</manifest>
</jar>
</target>
- Finally we need to create a distribution by copying all .jar
files into dist/lib
while using a flat directory structure:
-
<
target
name
=
"dist"
depends
=
"jar"
description
=
"Create binary distribution"
>
-
<
delete
dir
=
"${dist.home}"
/>
-
-
-
<
mkdir
dir
=
"${dist.home}/lib"
/>
-
-
<
copy
todir
=
"${dist.home}"
file
=
"${build.home}/${jar.name}"
/>
-
-
<
copy
todir
=
"${dist.home}/lib"
filtering
=
"off"
>
-
-
-
<
flattenmapper
/>
-
<
fileset
dir
=
"${lib.home}"
includes
=
"**/*.jar"
/>
-
</
copy
>
-
</
target
>
<target name="dist" depends="jar" description="Create binary distribution">
<delete dir="${dist.home}" />
<!-- contains all library dependencies -->
<mkdir dir="${dist.home}/lib" />
<copy todir="${dist.home}" file="${build.home}/${jar.name}" />
<copy todir="${dist.home}/lib" filtering="off">
<!-- remove the directory hierarchy: lib contains no subdirectories -->
<flattenmapper />
<fileset dir="${lib.home}" includes="**/*.jar" />
</copy>
</target>
I use Ant 1.6.2, and this works perfectly for me. Have fun!
分享到:
相关推荐
创建和编辑MANIFEST.MF文件可以使用文本编辑器或者构建工具,如Ant或Maven。例如,使用Ant的`<jar>`任务,可以在build.xml文件中指定manifest文件,并包含需要打包的类文件。这样,Ant会自动处理MANIFEST.MF的创建和...
- 使用`jar cvfm`命令打包并指定MANIFEST.MF: ```bash jar cvfm Hello.jar META-INF\manifest.mf HelloWorld.class ``` - 运行JAR包: ```bash java -jar Hello.jar ``` 6. **涉及多个依赖的JAR包**: - ...
5. **元素**:用来创建JAR文件,可以指定JAR的名称、包含的文件和目录,以及MANIFEST.MF文件,这在创建可执行JAR时尤其重要。 6. **MANIFEST.MF**:JAR的清单文件,用于指定主类(程序启动的入口点)和其他属性,如...
在本文中,我们将深入探讨如何使用Apache Ant工具在Windows环境下打包Hadoop-eclipse-plugin,这是一个允许开发者在Eclipse IDE中创建和调试Hadoop MapReduce项目的插件。以下是详细步骤: 首先,你需要下载Apache ...
在本文档中,我们主要关注Ant在创建和管理Java项目中的基本应用,特别是如何使用它来编写CC(可能是持续集成或者特定项目名缩写)中的`build.xml`文件。 ### 1. 拷贝操作 Ant 提供了`<copy>`任务来处理文件和目录...
3. **Classpath Management**:ANT脚本会管理所有依赖的类路径,确保所有必要的库都被包含在内,以便于编译和运行时使用。 4. **Source Code Compilation**:ANT可以调用Javac或使用其他的编译器来编译源代码,并...
6. **生成清单文件**:如果需要,可以创建一个`META-INF/MANIFEST.MF`文件来指定主类(应用程序的入口点)和其他元数据。 7. **执行Ant构建**:在命令行中运行`ant`命令,Ant会按照构建文件的指示执行所有任务。 8...
如果你的项目使用了Subversion进行版本控制,你可能需要将这个库添加到Ant的classpath中,以便在构建过程中进行版本控制操作。 总之,Java Ant是一个强大的工具,能够帮助开发者自动化Java项目的构建过程,包括打包...
-- 打包 jar 文件 --> ${dist.dir}/sample.jar" basedir="${classes.dir}" manifest="manifest.mf"> <manifest> <attribute name="Main-Class" value="powerwind.Sample" /> </manifest> 打包完成 <!...
`jarfile`定义生成的JAR文件名,`basedir`指定源代码目录,`manifest`可添加MANIFEST.MF文件。 3. **`<copy>`**:复制文件或目录。`tardir`指定目标目录,`todir`指定源文件或目录。 4. **`<delete>`**:删除文件...
1. **编写 Manifest 文件**:首先创建一个名为 `myapplication.mf` 的 Manifest 文件,内容如下: ```plaintext Manifest-Version: 1.0 Created-By: JDJ example Main-Class: com.example.myapp.MyAppMain ``` ...
5. **打包与归档**:使用`<jar>`, `<war>`等标签创建JAR或WAR文件,包含MANIFEST.MF文件的设置,以及资源文件的处理。 6. **依赖管理**:理解并使用`<classpath>`标签来管理构建过程中的类路径,包括项目内部和外部...
2. 打包任务:`<jar>`任务用于将编译后的类文件打包成JAR,可以自定义MANIFEST.MF文件。 3. 清理任务:`<delete>`任务用于删除文件或目录,常用于清理临时或生成的文件。 4. 复制任务:`<copy>`任务用于文件或目录的...
4. **添加MANIFEST文件**:如果需要在JAR文件中包含MANIFEST.MF,可以使用`manifest`元素来定义。 5. **资源处理**:除了Java源代码,你可能还需要处理其他资源文件,如图片、配置文件等。`copy`或`move`任务可以...
4. 替换或保留MANIFEST.MF:fatjar允许用户自定义或保留原有的MANIFEST.MF文件,以设定类加载器、版本信息等。 5. 支持ANT脚本:fatjar插件还提供了与ANT构建工具的集成,使得在ANT脚本中调用打包过程变得简单。 ...
`manifest`属性允许我们自定义MANIFEST.MF文件,添加版本信息和依赖库。 4. **测试**:Ant支持JUnit测试,通过`<junit>`任务,我们可以配置并运行测试用例,收集测试结果。`<junit>`任务可以指定测试类、报告输出...
Ant可以代替使用javac、java和jar等命令来执行java操作,从而达到轻松的构建和部署Java工程的目的。下面来看几个知识点。 1. 利用Ant的javac任务来编译java程序 Ant的javac任务用于实现编译Java程序的功能。下面来...
你可以通过`manifest`属性指定MANIFEST.MF文件,其中包含有关JAR的基本信息,如主类和版本信息。 `war`任务则专门用于创建Web应用的WAR文件,它是Java EE应用程序的标准打包格式。你可以包含Web应用的所有资源,如...
对于更复杂的需求,可以编写自定义的shell脚本或批处理文件,使用`jar`命令行工具进行打包,同时通过`--classpath`参数指定依赖库。 例如,我们可以创建一个简单的bash脚本: ```bash #!/bin/bash cd /path/to/...
* META-INF 文件夹:包含项目的META信息,例如 MANIFEST.MF 文件。 * 项目类文件夹:包含项目的所有 class 文件。 * 依赖项文件夹:包含项目依赖的所有 jar 文件。 五、Jar 文件的使用 生成的 Jar 文件可以用于...