A little sample:
* src\java\org\apache\ant\Application.java
Sample application which uses Log4J2 as external dependency
* src\resources\log4j2.xml
Configuration file for Log4J2
* build.xml
Ant buildscript
Run the script with "ant".
Then start the application with "java -jar lib\Application.jar".
The app will prompt all given arguments via Log4J2-Logger.
Have a look at the "build" target and the resulting manifest inside the jar.
Jan
Application.java
----8-<------8-<------8-<------8-<------8-<--
package org.apache.ant;
import java.util.stream.Stream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Application {
public static void main(String[] args) {
Logger logger = LogManager.getLogger(Application.class);
if (args.length == 0) {
logger.info("Application started without any argument.");
} else {
logger.info("Application started with %d arguments:%n",
args.length);
Stream.of(args)
.map( s -> "- '"+s+"'" )
.forEach(logger::info);
}
}
}
----8-<------8-<------8-<------8-<------8-<--
log4j2.xml
----8-<------8-<------8-<------8-<------8-<--
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}
- %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
----8-<------8-<------8-<------8-<------8-<--
build.xml
----8-<------8-<------8-<------8-<------8-<--
<project name="Application" default="build">
<property name="build.dir" value="build"/>
<property name="src.dir" value="src"/>
<property name="lib.dir" value="lib"/>
<property name="main.class" value="org.apache.ant.Application"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="java.src" value="${src.dir}/java"/>
<property name="resources.src" value="${src.dir}/resources"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="download-dependencies">
<mkdir dir="${lib.dir}"/>
<!-- Performance improvement: don't download multiple times -->
<!-- TODO: available+get as macro -->
<available property="log4j-core.present"
file="${lib.dir}/log4j-core-2.11.2.jar"/>
<get xmlns:unless="ant:unless"
unless:set="log4j-core.present"
src="https://search.maven.org/remotecontent?filepath=org/apache/logging/log4j/log4j-core/2.11.2/log4j-core-2.11.2.jar"
dest="${lib.dir}/log4j-core-2.11.2.jar" />
<available property="log4j-api.present"
file="${lib.dir}/log4j-api-2.11.2.jar"/>
<get xmlns:unless="ant:unless"
unless:set="log4j-api.present"
src="https://search.maven.org/remotecontent?filepath=org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar"
dest="${lib.dir}/log4j-api-2.11.2.jar" />
</target>
<target name="compile" depends="download-dependencies">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}"
includeantruntime="false">
<classpath id="cp.runtime">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</classpath>
</javac>
</target>
<target name="build" depends="compile">
<manifestclasspath property="jar.classpath"
jarfile="${build.dir}/${ant.project.name}.jar">
<classpath refid="cp.runtime"/>
</manifestclasspath>
<jar destfile="${build.dir}/${ant.project.name}.jar">
<fileset dir="${classes.dir}"/>
<fileset dir="${resources.src}"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
<attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
</jar>
</target>
</project>
----8-<------8-<------8-<------8-<------8-<--
> -----Ursprüngliche Nachricht-----
> Von: Jan Matèrne (jhm) [mailto:[email protected]]
> Gesendet: Montag, 25. Februar 2019 14:08
> An: 'Ant Users List'
> Betreff: AW: AW: Javac Run By Ant Script is Unable to Find External
> Jars
>
> Could you post the content of the manifest file and your directory
> structure?
>
> I suppose that the paths are not correct …
>
>
>
> Jan
>
>
>
> Von: Dennis Putnam [mailto:[email protected]]
> Gesendet: Montag, 25. Februar 2019 13:09
> An: [email protected]
> Betreff: Re: AW: Javac Run By Ant Script is Unable to Find External
> Jars
>
>
>
> My apologies again but I have not made any progress on this problem. Is
> there perhaps a better forum I should be using at this point? I did
> make one discovery. It appears that although the application works in
> Eclipse when I try to export it to a runnable jar using the Eclipse
> wizard, the resulting jar fails as well. It seems to me that the
> problem is not ant specific but something in the app build per se.
>
> On 2/21/2019 10:18 AM, Dennis Putnam wrote:
>
> I found an article on adding Maven dependencies to my ant script. While
> I'm getting a successful build but the same exception when I run the
> jar, I hope this is getting me closer. At least the pom.xml is in the
> build. I am wondering if the added fileset is right and working. Here
> is my latest:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <project name="KCBSEvents" default="jar" basedir="."
> xmlns:artifact="antlib:org.apache.maven.artifact.ant">
> <property name="build.properties" value="build.properties"/>
> <property name="resources" value="resource" />
> <property name="jardir" value="KCBSEvents" />
> <property name="KCBSDir" value="src/KCBSEvents" />
> <property name="member.number" value="000000" />
> <property name="member.name" value="" />
> <property name="jarpath" value="/${user.home}/.m2/repository"
> />
> <path id="maven-ant-tasks.classpath" path="/lib/jvm-
> exports/maven-ant-tasks-2.1.3.jar" />
> <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
> uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-
> tasks.classpath" />
> <artifact:pom id="pomfile" file="pom.xml" />
> <artifact:dependencies filesetId="mvn-dependencies"
> pomRefId="pomfile" />
> <path id="compile-jars">
> <multirootfileset basedirs="${jarpath}/commons-
> io/2.5,${jarpath}/httpcomponents-client,${jarpath}/commons-
> logging/1.2,${jarpath}/commons-codec/1.10,/lib/java-ext/json-simple-
> 1.1.1">
> <include name="commons-io-2.5.jar" />
> <include name="httpclient-4.5.6.jar" />
> <include name="httpcore-4.4.10.jar" />
> <include name="commons-logging-1.2.jar" />
> <include name="commons-codec-1.10.jar" />
> <include name="json-simple-1.1.1.jar" />
> </multirootfileset>
> <fileset refid="mvn-dependencies" />
> </path>
> <target name="checkOS">
> <condition property="isWindows">
> <os family="windows" />
> </condition>
> <condition property="isLinux">
> <os family="unix" />
> </condition>
> </target>
> <target name="if_windows" depends="checkOS" if="isWindows">
> <property name="jarfile" value="C:\temp\KCBSEvents.jar"
> />
> <property name="antcontrib" value="H:\html\Applets\ant-
> contrib" />
> </target>
> <target name="if_linux" depends="checkOS" if="isLinux">
> <property name="jarfile"
> value="/tmp/${member.number}/KCBSEvents.jar" />
> <property name="antcontrib"
> value="/var/www/html/Applets/ant-contrib/ant-contrib-1.0b3.jar" />
> </target>
> <target name="setclass" depends="if_linux,if_windows">
> <taskdef
> resource="net/sf/antcontrib/antcontrib.properties">
> <classpath>
> <pathelement location="${antcontrib}"
> />
> </classpath>
> </taskdef>
> </target>
> <target name="incserial" depends="setclass">
> <copy todir="bin/${jardir}/${resources}">
> <fileset dir="${KCBSDir}/${resources}">
> <include name="${build.properties}" />
> </fileset>
> <filterchain>
> <expandproperties />
> </filterchain>
> </copy>
> <if> <isset Property="build.number" /> <then>
> <echo message="update build requested" />
> </then> <else>
> <echo message="new build requested" />
> <buildnumber />
> </else> </if>
> <propertyfile
> file="bin/${jardir}/${resources}/${build.properties}">
> <entry key="serialnumber"
> value="${build.number}" />
> <entry key="membernumber"
> value="${member.number}" />
> <entry key="name" value="${member.name}" />
> </propertyfile>
> <echo message="serial number: ${build.number}" />
> </target>
> <target name="jar" description="Compile serialized jar"
> depends="incserial,if_windows,if_linux">
> <echo message="Using destination file ${jarfile}" />
> <javac srcdir="src" destdir="bin"
> includeantruntime="false" classpathref="compile-jars" />
> <jar destfile="${jarfile}" basedir="bin"
> filesetmanifest="mergewithoutmain">
> <manifest>
> <attribute name="Manifest-Version"
> value="1.0"/>
> <attribute name="Created-By" value="ant
> 1.9.2 on CentOS 7" />
> <attribute name="Main-Class"
> value="KCBSEvents.KCBSEvents" />
> </manifest>
> </jar>
> </target>
> </project>
>
>
> On 2/20/2019 3:22 PM, Jan Matèrne (jhm) wrote:
>
> If you have created your JAR the first step is done.
>
> Starting the JAR could be done in several ways. Common is that you have
> to have all external classes on the runtime classpath:
>
>
>
> 1. Hard coded start script.
>
> Write a bash/bat-Script with the java command with all cp settings,
> e.g. (bat)
>
> @echo off
>
> java -cp /build/myjar.jar;lib/one.jar;lib/two.jar;lib/three.jar
> org.acme.Main %*
>
>
>
> 2. Wrapper script which collects all JARs in a dynamic way (see
> ant.bat|ant.sh)
>
>
>
> 3. Use Ant + <java><classpath> for starting
>
>
>
> 4. Create a runnable JAR which references the external JARs (manifest:
> main-class + classpath)
>
>
>
> 5. Create a shaded jar (uber jar, fat jar): include all classes from
> external jars into your jar
>
>
>
> 6. Use a launcher which uses a dependency manager for getting the
> classpath
>
>
>
>
>
>
>
> You don't have to replicate path definitions in your buildfile, you
> could (and should) use references:
>
> <javac><classpath id="runtime.cp"><fileset dir="lib"
> includes="**/*.jar"/>…
>
> <java><classpath refid="runtime.cp"/>
>
>
>
>
>
> You mave have a look at http://ant.apache.org/manual/tutorial-
> HelloWorldWithAnt.html
>
>
>
>
>
> Jan
>
>
>
>
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]