【发布时间】:2012-04-10 02:23:33
【问题描述】:
我查看了this question,但它并没有真正解决我的问题,所以我想我会发布一个新的。
我需要使用 Ant 创建一个可运行的 jar(只需双击即可运行)。我有以下 java 代码和 build.xml 文件,它可以很好地编译代码并创建一个 jar 文件,但是当我尝试通过双击运行 jar 时,我收到一条消息“找不到主类:HttpController. java。”
我怀疑我的问题与加载外部 Apache Http.jar 有关,因为我已经成功地为一个相同的项目构建并运行了一个 jar,只是它没有引用任何外部 jar。
这是我的代码:
HttpController.java:
package pack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpMessage;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class HttpController {
public static void main(String[] args) {
DefaultHttpClient client = new DefaultHttpClient();
HttpHost httphost = new HttpHost("localhost", 80);
try {
HttpMessage req = new HttpGet("/test.html");
HttpResponse resp = client.execute(httphost, (HttpGet) req);
HttpEntity entity = resp.getEntity();
BufferedReader in = new BufferedReader(new InputStreamReader(
entity.getContent()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// shutdown the connection
client.getConnectionManager().shutdown();
}
}
}
build.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Test" basedir="." default="jar">
<property name="source.dir" value="src"/>
<property name="lib.dir" value="lib"/>
<property name="class.dir" value="bin"/>
<property name="jar.dir" value="dist"/>
<property name="main-class" value="pack.HttpController"/>
<path id="libraries.path">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean" description="delete old files">
<delete dir="${class.dir}"/>
<delete dir="${jar.dir}"/>
</target>
<target name="compile" description="build class files" depends="clean">
<mkdir dir="${class.dir}"/>
<javac srcdir="${source.dir}" destdir="${class.dir}">
<classpath refid="libraries.path"/>
</javac>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<mkdir dir="${jar.dir}/${lib.dir}"/>
<copy todir="${jar.dir}/${lib.dir}" flatten="true">
<path refid="libraries.path"/>
</copy>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${class.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
<attribute name="Class-Path" value="${jar.dir}/${lib.dir}/Apache HTTP.jar"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
</target>
</project>
清单.MF:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.6.0_31-b05 (Sun Microsystems Inc.)
Main-Class: HttpController
Class-Path: dist/lib
EDIT build.xml 已根据 Mike 的回答进行了更新。问题仍然没有解决。根据 Danation 的回答,还发布了清单文件的内容。
【问题讨论】:
-
@jayan 是否可以在没有任何外部工具的情况下做到这一点?即只使用 Ant 并编写我自己的 build.xml 文件?
-
SO 中有关于使用 Eclipse 等创建可运行 jar 的问题/答案。请参阅此 stackoverflow.com/questions/502960/…。我更喜欢 one-jar,因为它创建了一个可运行的文件。集成到 ant 需要 10 分钟。那为什么不试试看结果呢?
-
Class-Path采用文档中的文件名列表。不是目录。 -
@jayan 使用 eclipse 导出到可执行 jar 不是我想要做的。我需要使用 Ant 生成一个可执行的 jar。最终目标是能够分发源代码并允许用户通过在命令行上执行
ant来执行代码,然后双击生成的 jar 文件。此外,我宁愿不必安装 Ant 本身以外的外部工具。我需要知道如何仅使用 Ant 来做到这一点。