To my surprise the build.xml
file generated by Eclipse (Neon) for Java has no element containing an invocation of a jar
task. As often is the case with code generation I think you have to use it and make no edits so that you can regenerate - or - avoid code generation completely. A comment in the generated file suggests it might be possible to avoid edits by extending the capabilities by importing.
<!-- WARNING: Eclipse auto-generated file.
Any modifications will be overwritten.
To include a user specific buildfile here, simply create one in the same
directory with the processing instruction <?eclipse.ant.import?>
as the first entry and export the buildfile again. -->
I thought I would be able to use the <?eclipse.ant.import?>
element in an second file called export.xml
. In ant
scripting there is supposed to be one project per buildfile so now there is a second project with a dependency on a target in the first project.
Regenerating build.xml
reveals that it contains an "import" as expected.
<import file="export.xml"/>
Unfortunately this does not work. Running ant
, which I do from the command line, just seems to result in the export/jar
project being ignored.
The generated script with the import element (nested on the 7th line)...
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="ohana1">
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.8"/>
<property name="source" value="1.8"/>
<import file="export.xml"/>
<path id="ohana1.classpath">
<pathelement location="bin"/>
<pathelement location="../export/ohana1/commons-collections-3.2.1.jar"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="src">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>
<target depends="init" name="build-project">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
<src path="src"/>
<classpath refid="ohana1.classpath"/>
</javac>
</target>
<target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
<target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
<copy todir="${ant.library.dir}">
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</copy>
<unzip dest="${ant.library.dir}">
<patternset includes="jdtCompilerAdapter.jar"/>
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</unzip>
</target>
<target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<antcall target="build"/>
</target>
</project>
The export.xml
file meant to make a jar
...
<?eclipse.ant.import?>
<project basedir="." default="export" name="ohana1Export">
<target depends="build,make-jar" name="export"/>
<target name="make-jar">
<jar destfile="../export/ohana1/${ant.project.name}.jar" basedir="bin"/>
</target>
</project>
Note that the Eclipse Ant editor complains about this export.xml
file because the target named build
, which is a dependency, does not exist in this project/buildfile. The build
target is in the generated build.xml
. That error might be coming from a "dumb" editor so I went ahead to do a run of ant
. Invoking ant
from the command line I find that there is no jar
file made.
Should I conclude that Eclipse's ant
script generator is useless if you need to export a .jar
file and that a human should maintain the ant
script that meets all the requirements?
Yes, in my opinion the exported build.xml
is useless, as of Eclipse Neon, if the intention is to make a .jar
.
Specifically do the following.
ant
script that exports a .jar
. The link at the bottom of this post has verbatim text on what the script might look like. You can use the built-in Xml Editor
via New > Other > XML > XML File
to create this new file which might be called makeJar.xml
and save it. If the icon shown in the Package Explorer
is still a plain XML file icon refreshing the project may change the icon to an Ant
file icon. In the future, you can use Open With
to get the Ant Editor
instead of the XML Editor
. This script will replace the manual exporting of a .jar
that the user would otherwise perform via Eclipse. Project > Properties > Builders
. It would be placed second in the list of Builders. First in the list of Builders is the Java Builder
which should already exist. When an Eclipse build is invoked the entire list of Builders will be processed in the order shown in the list of Builders. Thus not only will .class
files be generated but also the .jar
. What is achieved is greater automation since the .class
generation and .jar
generation are now integrated, which arguably was the point of using the exported build.xml
in a failed attempt to generate the .jar
.
Here is the dialog at Project > Properties > Builders
that you can use to create a new Builder. Select New
then select Ant Builder
. I gave the name makeJar
to the new Builder
.
Here is the dialog for the new Ant
Builder that will allow you to browse to your buildfile
which is your manually written Ant
script that creates a .jar
file. In this example the script is makeJar.xml
. It also allows you to browse to the base directory
to be used when the script is run.
After setting up the new Builder, a project "clean" or project "build" will create .class
files and also the .jar
.
Eclipse's documentation on this subject is at the link. Note that it seems impossible to link the exact page that contains the instructions so you have to browse down the documentation tree to the section about "Ant buildfiles as project builders".