ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dennis Putnam <d...@bellsouth.net>
Subject Re: AW: AW: Javac Run By Ant Script is Unable to Find External Jars
Date Mon, 25 Feb 2019 16:26:42 GMT
Hi Jan,

I need to take a timeout. In my machinations I've created a new problem
that seems unrelated to ant. I'm trying to resolve that via the Eclipse
forum. I don't know if this new problem is masking the original one or
if it is related. I'll have to get back to you when I know which.

On 2/25/2019 9:15 AM, Jan Matèrne (jhm) wrote:
> 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:apache@materne.de]
>> 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:dap1@bellsouth.net]
>> Gesendet: Montag, 25. Februar 2019 13:09
>> An: user@ant.apache.org
>> 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: user-unsubscribe@ant.apache.org
> For additional commands, e-mail: user-help@ant.apache.org
>
>



Mime
View raw message