Spojrzałem na this question, ale to naprawdę nie rozwiązało mojego problemu, więc pomyślałem, że opublikuję nowy.jak utworzyć pakietowy, działający jar, używając Ant
Potrzebuję utworzyć działający słoik (można go uruchomić po prostu klikając dwukrotnie) za pomocą Ant. Mam następujący kod java i plik build.xml, który kompiluje kod po prostu dobrze i tworzy plik jar, ale gdy spróbuję uruchomić jar przez podwójne kliknięcie, pojawia się komunikat "Nie można znaleźć głównej klasy: HttpController. Jawa."
Mam podejrzenie, że mój problem ma związek z ładowaniem zewnętrznego Apache Http.jar
, ponieważ udało mi się zbudować i uruchomić słoik dla projektu, który jest identyczny, z tym że nie odnosi się do żadnych zewnętrznych słoików.
Oto mój kod:
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>
MANIFEST.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 plik build.xml został zaktualizowany zgodnie z odpowiedzią Mike'a. Problem nadal nie został rozwiązany. Zamieszczono również treść pliku manifestu, zgodnie z odpowiedzią Danation.
@ see http://one-jar.sourceforge.net/index.php?page=build-tools&file=ant-example. – Jayan
@jayan czy można to zrobić bez zewnętrznych narzędzi? tj. po prostu używając Ant i napisanie własnego pliku build.xml? – ewok
Istnieją pytania/odpowiedzi w SO na temat tworzenia działających słoików za pomocą Eclipse itp. Zobacz ten http://stackoverflow.com/questions/502960/eclipse-how-to-build-an-executable-jar-with-external-jar. Wolę jeden-jar, ponieważ tworzy pojedynczy uruchamiany plik. Intgrating to mrówka powinna zająć 10 minut. Dlaczego więc nie spróbować zobaczyć wyniku? – Jayan