Skip to content

Running Epsilon's Ant Tasks from Command Line

This example project shows how to download, configure and run Epsilon's Ant tasks from the command line using Ant, Maven and Gradle. To debug Epsilon scripts running from these tasks, read these instructions.

To run the examples below, you only need to have Ant, Maven or Gradle installed in your system.

Ant

When you run the ant command in the root directory of the project, the following will happen:

  • The build file (build.xml) will download Apache Ivy in a temporary directory
  • Ivy will fetch the required Epsilon jars (also in a temporary directory) from Maven Central/Sonatype
  • The build file will set up Epsilon's Ant tasks
  • The following part of the build file will be executed, which will load an EMF-based model and then run an EOL program against it
<epsilon.emf.loadModel name="Library" modelfile="library.model" 
    metamodelfile="library.ecore"/>

<epsilon.eol>
    for (writer in Writer.all) {
        (writer.name + " wrote " + writer.books.title.concat(", ")).println();
    }
    <model ref="Library"/>
</epsilon.eol>

If everything goes well, the last few lines of the output of the ant command should look like this:

run-epsilon:
[epsilon.eol] Agatha Christie wrote Endless Night

BUILD SUCCESSFUL

The complete source code is below and in Epsilon's Git repo.

<project default="run-epsilon" xmlns:ivy="antlib:org.apache.ivy.ant">

    <!-- This part of the build file runs our Epsilon tasks -->
    <target name="run-epsilon" depends="setup-epsilon">
        <!-- Load the library.model EMF model -->
        <epsilon.emf.loadModel name="Library" modelfile="library.model" metamodelfile="library.ecore"/>

        <!-- Run library.eol against it -->
        <epsilon.eol src="library.eol">
            <model ref="Library"/>
        </epsilon.eol>
    </target>

    <!-- The rest of the build file downloads Ivy, fetches the Epsilon jars and sets up the Epsilon ANT tasks -->
    <property name="ivy.version" value="2.5.0"/>
    <property name="ivy.jar.dir" value="${basedir}/ivy"/>
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"/>

    <!-- Downloads Ivy -->
    <target name="download-ivy" unless="skip.download">
        <mkdir dir="${ivy.jar.dir}"/>
        <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar"
             dest="${ivy.jar.file}" usetimestamp="true"/>
    </target>

    <!-- Sets up the Ivy ANT tasks -->
    <target name="setup-ivy" depends="download-ivy">
        <path id="ivy.lib.path">
            <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
    </target>

    <target name="setup-epsilon" depends="setup-ivy">
        <!-- Uncomment the line below to clear Ivy's cache -->
        <!--ivy:cleancache/-->
        <ivy:settings file="ivysettings.xml" />

        <!-- Fetch all relevant Epsilon jars under lib/binaries -->
        <ivy:retrieve conf="binaries" pattern="lib/[conf]/[artifact](-[classifier]).[ext]"/>

        <!-- Construct a path from all the jars under lib/binaries -->
        <path id="lib.path">
            <fileset dir="lib/binaries" includes="*.jar"/>
        </path>

        <!-- Load the ANT tasks from o.e.e.workflow and o.e.e.workflow.emf using the same classloader -->
        <taskdef classpathref="lib.path" resource="org/eclipse/epsilon/workflow/tasks/tasks.xml" loaderref="lib.path.loader"/>

        <taskdef classpathref="lib.path" resource="org/eclipse/epsilon/workflow/tasks/emf/tasks.xml" loaderref="lib.path.loader"/>

    </target>

</project>
<ivy-module version="2.0">
    <info organisation="" module=""/>
    <configurations>
        <conf name="binaries" />
    </configurations>
    <dependencies>
        <dependency org="org.eclipse.epsilon" name="org.eclipse.epsilon.workflow" rev="2.5.0" conf="binaries->default"/>
        <dependency org="org.eclipse.epsilon" name="org.eclipse.epsilon.workflow.emf" rev="2.5.0" conf="binaries->default"/>
        <exclude artifact="org.eclipse.equinox.registry"/>
        <exclude artifact="org.eclipse.core.runtime"/>
    </dependencies>
</ivy-module>
<ivysettings>

    <settings defaultResolver="default-chain" defaultConflictManager="all" />

    <resolvers>
        <ibiblio name="maven-central"  m2compatible="true" usepoms="true" />
        <ibiblio name="sonatype-snapshots" root="https://oss.sonatype.org/content/repositories/snapshots" m2compatible="true"/>
        <chain name="default-chain">
            <resolver ref="sonatype-snapshots"/>
            <resolver ref="maven-central"/>
        </chain>
    </resolvers>

</ivysettings>

Maven

Since Maven can run Ant tasks, Epsilon Ant tasks can also be executed from a Maven build (mvn clean package) as shown below.

<project>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>epsilon-maven</artifactId>
  <groupId>org.eclipse.epsilon</groupId>
  <version>1.0-SNAPSHOT</version>
  <pluginRepositories>
    <pluginRepository>
        <id>Sonatype</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <configuration>
              <target>
                <!-- Set up the core Epsilon tasks -->
                <taskdef
                  resource="org/eclipse/epsilon/workflow/tasks/tasks.xml"/>

                <!-- Set up the Epsilon EMF tasks -->
                <taskdef
                  resource="org/eclipse/epsilon/workflow/tasks/emf/tasks.xml"/>

                <!-- Load the library.model EMF model -->
                <epsilon.emf.loadModel name="Library"
                  modelfile="library.model"
                  metamodelfile="library.ecore"/>

                <!-- Run library.eol against it -->
                <epsilon.eol src="library.eol">
                    <model ref="Library"/>
                </epsilon.eol>

                <!-- Run library.eunit -->
                <epsilon.eunit src="library.eunit">
                  <modelTasks>
                    <epsilon.emf.loadModel name="A" metamodelfile="library.ecore" read="false" store="false" modelfile="dummyA.model"/>
                    <epsilon.emf.loadModel name="B" metamodelfile="library.ecore" read="false" store="false" modelfile="dummyB.model"/>
                  </modelTasks>
                  <comparators>
                    <comparator classname="org.eclipse.epsilon.eunit.cmp.emf.EMFModelComparator" />
                  </comparators>
                </epsilon.eunit>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.eclipse.epsilon</groupId>
            <artifactId>org.eclipse.epsilon.workflow</artifactId>
            <version>2.5.0</version>
          </dependency>
          <dependency>
            <groupId>org.eclipse.epsilon</groupId>
            <artifactId>org.eclipse.epsilon.workflow.emf</artifactId>
            <version>2.5.0</version>
          </dependency>
          <dependency>
            <groupId>org.eclipse.epsilon</groupId>
            <artifactId>org.eclipse.epsilon.eunit.cmp.emf</artifactId>
            <version>2.5.0</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>

Gradle

Since Gradle can also run Ant tasks, Epsilon Ant tasks can also be executed from a Gradle build (gradle run) as shown below.

configurations {
    epsilon
}

repositories {
    mavenCentral()
}

dependencies {
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow:2.5.0'
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow.emf:2.5.0'
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.eunit.cmp.emf:2.5.0'
}

task setupEpsilonTasks {
    // Set up the core Epsilon tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')
    // Set up the Epsilon EMF tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/emf/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')
    // Set logging level to info so that EOL's println() is not suppressed
    ant.lifecycleLogLevel = 'INFO'
}

task run {
    dependsOn tasks.setupEpsilonTasks
    // Load the library.model EMF model
    ant.'epsilon.emf.loadModel'(name: 'Library', 
        modelfile: 'library.model', metamodelfile: 'library.ecore')

    // Run library.eol against it
    ant.'epsilon.eol'(src: 'library.eol'){ model(ref: 'Library') }

    // Run library.eunit
    ant.'epsilon.eunit'(src: 'library.eunit'){
        modelTasks() {
            ant.'epsilon.emf.loadModel'(name: 'A', metamodelfile: 'library.ecore',
                read: 'false', store: 'false', modelfile: 'dummyA.model')
            ant.'epsilon.emf.loadModel'(name: 'B', metamodelfile: 'library.ecore',
                read: 'false', store: 'false', modelfile: 'dummyB.model')
        }
        comparators() {
            comparator(classname:
                'org.eclipse.epsilon.eunit.cmp.emf.EMFModelComparator')
        }
    }
}

Flexmi and Emfatic

You can also use Flexmi instead of XMI (library.flexmi instead of library.model) for the model, and Emfatic instead of Ecore (library.emf instead of library.ecore) by adding the following dependency to your ANT/Maven/Gradle build.

<dependency org="org.eclipse.emfatic" name="org.eclipse.emfatic.core" rev="1.1.0" conf="binaries->default"/>
<dependency>
    <groupId>org.eclipse.emfatic</groupId>
    <artifactId>org.eclipse.emfatic.core</artifactId>
    <version>1.1.0</version>
</dependency>
epsilon 'org.eclipse.emfatic:org.eclipse.emfatic.core:1.1.0'

A complete Gradle example that uses library.flexmi instead of (the XMI-based) library.model, and library.emf instead of library.ecore is shown below.

configurations {
    epsilon
}

repositories {
    mavenCentral()
}

dependencies {
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow:2.5.0'
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow.emf:2.5.0'
    epsilon 'org.eclipse.emfatic:org.eclipse.emfatic.core:1.1.0'
}

task setupEpsilonTasks {
    // Set up the core Epsilon tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')
    // Set up the Epsilon EMF tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/emf/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')
    // Set logging level to info so that EOL's println() is not suppressed
    ant.lifecycleLogLevel = 'INFO'
}

task run {
    dependsOn tasks.setupEpsilonTasks
    // Load the library.flexmi EMF model
    ant.'epsilon.emf.loadModel'(name: 'Library', 
        modelfile: '../library.flexmi', metamodelfile: '../library.emf')

    // Run library.eol against it
    ant.'epsilon.eol'(src: '../library.eol'){ model(ref: 'Library') }
}
for (writer in Writer.all) {
    (writer.name + " wrote " + writer.books.title.concat(", ")).println();
}
<?nsuri library?>
<library>
  <writer name="Agatha Christie"/>
  <book title="Endless Night" pages="224" author="Agatha Christie"/>
</library>
@namespace(uri="library", prefix="")
package library;

class Library {
    val Writer[*] writers;
    val Book[*] books;
}

class Writer {
    attr String name;
    ref Book[*]#author books;
}

class Book {
    attr String title;
    attr int pages = 100;
    attr BookCategory category;
    ref Writer[1]#books author;
}

enum BookCategory {
    Mystery = 0;
    ScienceFiction = 1;
    Biography = 2;
}

Excel

The example below demonstrates using the generic epsilon.loadModel task to run the same EOL program against an Excel spreadsheet.

configurations {
    epsilon
}

repositories {
    mavenCentral()
}

dependencies {
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow:2.5.0'
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.emc.spreadsheets.excel:2.5.0'
}

task setupEpsilonTasks {
    // Set up the core Epsilon tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')
    // Set logging level to info so that EOL's println() is not suppressed
    ant.lifecycleLogLevel = 'INFO'
}

task run {
    dependsOn tasks.setupEpsilonTasks
    // Load the library.xlsx spreadsheet
    ant.'epsilon.loadModel'(name: 'Library', impl: 'org.eclipse.epsilon.emc.spreadsheets.excel.ExcelModel'){
        parameter(name: 'SPREADSHEET_FILE', file: 'library.xlsx')
        parameter(name: 'CONFIGURATION_FILE', file: 'mapping.xml')
    }

    // Run library.eol against it
    ant.'epsilon.eol'(src: '../library.eol'){ model(ref: 'Library') }
}
<spreadsheet>
  <worksheet name="Writer">
    <column name="name"/>
    <column name="books" many="true"/>
  </worksheet>
  <worksheet name="Book">
    <column name="id"/>
    <column name="title"/>    
    <column name="pages" datatype="integer"/>
  </worksheet>
  <reference source="Writer->books"
             target="Book->id"/>                    
</spreadsheet>

UML

Models conforming to the Eclipse UML2 metamodel can be queried as shown below.

configurations {
    epsilon
}

repositories {
    maven {
        url "https://repo.eclipse.org/content/repositories/acceleo-releases/"
    }
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
    mavenCentral()
}

dependencies {
    epsilon('org.eclipse.epsilon:org.eclipse.epsilon.emc.uml:2.5.0') {
        // UML2 is broken on Maven Central
        exclude group: 'org.eclipse.uml2'
    }
    epsilon 'org.eclipse.epsilon:org.eclipse.epsilon.workflow:2.5.0'

    // Fetch the UML2 dependencies from repo.eclipse.org instead
    epsilon 'org.eclipse.uml2:org.eclipse.uml2.uml:5.0.1.v20140910-1354'
    epsilon 'org.eclipse.uml2:org.eclipse.uml2.common:2.0.1.v20140910-1354'
    epsilon 'org.eclipse.uml2:org.eclipse.uml2.types:2.0.0.v20140910-1354'
}

task setupEpsilonTasks {

    // Set up the core Epsilon tasks
    ant.taskdef(resource: 'org/eclipse/epsilon/workflow/tasks/tasks.xml', 
        classpath: configurations.epsilon.asPath, loaderref: 'epsilon')

    // Set logging level to info so that EOL's println() is not suppressed
    ant.lifecycleLogLevel = 'INFO'
}

task run {
    dependsOn tasks.setupEpsilonTasks

    // Load a UML model from model.uml
    ant.'epsilon.loadModel'(name: 'UML', impl: 'org.eclipse.epsilon.emc.uml.UmlModel'){
        parameter(name: 'modelFile', file: 'model.uml')
    }

    // Run library.eol against it
    ant.'epsilon.eol'(src: 'uml.eol'){ model(ref: 'UML') }

}
// Print the names of all
// classes in the model
for (c in Class.all) {
    c.name.println();
}
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
  <uml:Model xmi:id="_in3dgJiMEeuzROqeHhotPw" name="umlcddemo">
    <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
      <eAnnotations xmi:id="_in3dgJiMEeuzROqeHhotPw0" source="genmymodel">
        <details xmi:id="_in3dgJiMEeuzROqeHhotPw00" key="uuid" value="_in3dgJiMEeuzROqeHhotPw"/>
        <details xmi:id="_in3dgJiMEeuzROqeHhotPw01" key="author" value="kolovos"/>
      </eAnnotations>
    </xmi:Extension>
    <packageImport xmi:id="_in3dgZiMEeuzROqeHhotPw" importingNamespace="_in3dgJiMEeuzROqeHhotPw">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_in3dgZiMEeuzROqeHhotPw0" source="genmymodel">
          <details xmi:id="_in3dgZiMEeuzROqeHhotPw00" key="uuid" value="_in3dgZiMEeuzROqeHhotPw"/>
        </eAnnotations>
      </xmi:Extension>
      <importedPackage href="http://www.omg.org/spec/UML/20131001/PrimitiveTypes.xmi#/"/>
    </packageImport>
    <packagedElement xsi:type="uml:Class" xmi:id="_rAoBcHq6EDmVkdImmyh-dQ" name="Project">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_rAoBcHq6EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_rAoBcHq6EDmVkdImmyh-dQ00" key="uuid" value="_rAoBcHq6EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
    </packagedElement>
    <packagedElement xsi:type="uml:Class" xmi:id="_xAOzcHq6EDmVkdImmyh-dQ" name="Task">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_xAOzcHq6EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_xAOzcHq6EDmVkdImmyh-dQ00" key="uuid" value="_xAOzcHq6EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
    </packagedElement>
    <packagedElement xsi:type="uml:Association" xmi:id="_yHEfsXq6EDmVkdImmyh-dQ" name="Project_Task" memberEnd="_yHD4oXq6EDmVkdImmyh-dQ _yHCqgHq6EDmVkdImmyh-dQ" navigableOwnedEnd="_yHCqgHq6EDmVkdImmyh-dQ _yHD4oXq6EDmVkdImmyh-dQ">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_yHEfsXq6EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_yHEfsXq6EDmVkdImmyh-dQ00" key="uuid" value="_yHEfsXq6EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
      <ownedEnd xmi:id="_yHCqgHq6EDmVkdImmyh-dQ" name="project" type="_rAoBcHq6EDmVkdImmyh-dQ" owningAssociation="_yHEfsXq6EDmVkdImmyh-dQ" association="_yHEfsXq6EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_yHCqgHq6EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_yHCqgHq6EDmVkdImmyh-dQ00" key="uuid" value="_yHCqgHq6EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_yHDRkHq6EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_yHDRkHq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_yHDRkHq6EDmVkdImmyh-dQ00" key="uuid" value="_yHDRkHq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralInteger" xmi:id="_yHD4oHq6EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_yHD4oHq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_yHD4oHq6EDmVkdImmyh-dQ00" key="uuid" value="_yHD4oHq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
      <ownedEnd xmi:id="_yHD4oXq6EDmVkdImmyh-dQ" name="tasks" type="_xAOzcHq6EDmVkdImmyh-dQ" owningAssociation="_yHEfsXq6EDmVkdImmyh-dQ" association="_yHEfsXq6EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_yHD4oXq6EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_yHD4oXq6EDmVkdImmyh-dQ00" key="uuid" value="_yHD4oXq6EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_yHD4onq6EDmVkdImmyh-dQ">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_yHD4onq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_yHD4onq6EDmVkdImmyh-dQ00" key="uuid" value="_yHD4onq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralUnlimitedNatural" xmi:id="_zUmCwHq6EDmVkdImmyh-dQ" value="*">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_zUmCwHq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_zUmCwHq6EDmVkdImmyh-dQ00" key="uuid" value="_zUmCwHq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
    </packagedElement>
    <packagedElement xsi:type="uml:Class" xmi:id="_86ZfYHq6EDmVkdImmyh-dQ" name="Person">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_86ZfYHq6EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_86ZfYHq6EDmVkdImmyh-dQ00" key="uuid" value="_86ZfYHq6EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
    </packagedElement>
    <packagedElement xsi:type="uml:Association" xmi:id="_-j5z0nq6EDmVkdImmyh-dQ" name="Project_Person" memberEnd="_-j5Mwnq6EDmVkdImmyh-dQ _-j4lsnq6EDmVkdImmyh-dQ" navigableOwnedEnd="_-j4lsnq6EDmVkdImmyh-dQ _-j5Mwnq6EDmVkdImmyh-dQ">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_-j5z0nq6EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_-j5z0nq6EDmVkdImmyh-dQ00" key="uuid" value="_-j5z0nq6EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
      <ownedEnd xmi:id="_-j4lsnq6EDmVkdImmyh-dQ" name="project" type="_rAoBcHq6EDmVkdImmyh-dQ" owningAssociation="_-j5z0nq6EDmVkdImmyh-dQ" association="_-j5z0nq6EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_-j4lsnq6EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_-j4lsnq6EDmVkdImmyh-dQ00" key="uuid" value="_-j4lsnq6EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_-j5MwHq6EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_-j5MwHq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_-j5MwHq6EDmVkdImmyh-dQ00" key="uuid" value="_-j5MwHq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralInteger" xmi:id="_-j5MwXq6EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_-j5MwXq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_-j5MwXq6EDmVkdImmyh-dQ00" key="uuid" value="_-j5MwXq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
      <ownedEnd xmi:id="_-j5Mwnq6EDmVkdImmyh-dQ" name="persons" type="_86ZfYHq6EDmVkdImmyh-dQ" owningAssociation="_-j5z0nq6EDmVkdImmyh-dQ" association="_-j5z0nq6EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_-j5Mwnq6EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_-j5Mwnq6EDmVkdImmyh-dQ00" key="uuid" value="_-j5Mwnq6EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_-j5z0Hq6EDmVkdImmyh-dQ">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_-j5z0Hq6EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_-j5z0Hq6EDmVkdImmyh-dQ00" key="uuid" value="_-j5z0Hq6EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralUnlimitedNatural" xmi:id="_Ctk-8Hq7EDmVkdImmyh-dQ" value="*">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_Ctk-8Hq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_Ctk-8Hq7EDmVkdImmyh-dQ00" key="uuid" value="_Ctk-8Hq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
    </packagedElement>
    <packagedElement xsi:type="uml:Class" xmi:id="_FYr6UHq7EDmVkdImmyh-dQ" name="Effort">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_FYr6UHq7EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_FYr6UHq7EDmVkdImmyh-dQ00" key="uuid" value="_FYr6UHq7EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
    </packagedElement>
    <packagedElement xsi:type="uml:Association" xmi:id="_HOgzgXq7EDmVkdImmyh-dQ" name="Effort_Person" memberEnd="_HOgMcHq7EDmVkdImmyh-dQ _HOeXQnq7EDmVkdImmyh-dQ" navigableOwnedEnd="_HOeXQnq7EDmVkdImmyh-dQ _HOgMcHq7EDmVkdImmyh-dQ">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_HOgzgXq7EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_HOgzgXq7EDmVkdImmyh-dQ00" key="uuid" value="_HOgzgXq7EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
      <ownedEnd xmi:id="_HOeXQnq7EDmVkdImmyh-dQ" name="effort" type="_FYr6UHq7EDmVkdImmyh-dQ" owningAssociation="_HOgzgXq7EDmVkdImmyh-dQ" association="_HOgzgXq7EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_HOeXQnq7EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_HOeXQnq7EDmVkdImmyh-dQ00" key="uuid" value="_HOeXQnq7EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_HOflYHq7EDmVkdImmyh-dQ">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_HOflYHq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_HOflYHq7EDmVkdImmyh-dQ00" key="uuid" value="_HOflYHq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralUnlimitedNatural" xmi:id="_N8H7AHq7EDmVkdImmyh-dQ" value="*">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_N8H7AHq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_N8H7AHq7EDmVkdImmyh-dQ00" key="uuid" value="_N8H7AHq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
      <ownedEnd xmi:id="_HOgMcHq7EDmVkdImmyh-dQ" name="person" type="_86ZfYHq6EDmVkdImmyh-dQ" owningAssociation="_HOgzgXq7EDmVkdImmyh-dQ" association="_HOgzgXq7EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_HOgMcHq7EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_HOgMcHq7EDmVkdImmyh-dQ00" key="uuid" value="_HOgMcHq7EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_HOgMcXq7EDmVkdImmyh-dQ">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_HOgMcXq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_HOgMcXq7EDmVkdImmyh-dQ00" key="uuid" value="_HOgMcXq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralInteger" xmi:id="_HOgzgHq7EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_HOgzgHq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_HOgzgHq7EDmVkdImmyh-dQ00" key="uuid" value="_HOgzgHq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
    </packagedElement>
    <packagedElement xsi:type="uml:Association" xmi:id="_JLgrt3q7EDmVkdImmyh-dQ" name="Effort_Task" memberEnd="_JLgrtHq7EDmVkdImmyh-dQ _JLgrsXq7EDmVkdImmyh-dQ" navigableOwnedEnd="_JLgrsXq7EDmVkdImmyh-dQ _JLgrtHq7EDmVkdImmyh-dQ">
      <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
        <eAnnotations xmi:id="_JLgrt3q7EDmVkdImmyh-dQ0" source="genmymodel">
          <details xmi:id="_JLgrt3q7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrt3q7EDmVkdImmyh-dQ"/>
        </eAnnotations>
      </xmi:Extension>
      <ownedEnd xmi:id="_JLgrsXq7EDmVkdImmyh-dQ" name="effort" type="_FYr6UHq7EDmVkdImmyh-dQ" owningAssociation="_JLgrt3q7EDmVkdImmyh-dQ" association="_JLgrt3q7EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_JLgrsXq7EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_JLgrsXq7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrsXq7EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_JLgrsnq7EDmVkdImmyh-dQ">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_JLgrsnq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_JLgrsnq7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrsnq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralUnlimitedNatural" xmi:id="_TnCPYHq7EDmVkdImmyh-dQ" value="*">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_TnCPYHq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_TnCPYHq7EDmVkdImmyh-dQ00" key="uuid" value="_TnCPYHq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
      <ownedEnd xmi:id="_JLgrtHq7EDmVkdImmyh-dQ" name="task" type="_xAOzcHq6EDmVkdImmyh-dQ" owningAssociation="_JLgrt3q7EDmVkdImmyh-dQ" association="_JLgrt3q7EDmVkdImmyh-dQ">
        <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
          <eAnnotations xmi:id="_JLgrtHq7EDmVkdImmyh-dQ0" source="genmymodel">
            <details xmi:id="_JLgrtHq7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrtHq7EDmVkdImmyh-dQ"/>
          </eAnnotations>
        </xmi:Extension>
        <lowerValue xsi:type="uml:LiteralInteger" xmi:id="_JLgrtXq7EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_JLgrtXq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_JLgrtXq7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrtXq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </lowerValue>
        <upperValue xsi:type="uml:LiteralInteger" xmi:id="_JLgrtnq7EDmVkdImmyh-dQ" value="1">
          <xmi:Extension extender="http://www.eclipse.org/emf/2002/Ecore">
            <eAnnotations xmi:id="_JLgrtnq7EDmVkdImmyh-dQ0" source="genmymodel">
              <details xmi:id="_JLgrtnq7EDmVkdImmyh-dQ00" key="uuid" value="_JLgrtnq7EDmVkdImmyh-dQ"/>
            </eAnnotations>
          </xmi:Extension>
        </upperValue>
      </ownedEnd>
    </packagedElement>
  </uml:Model>
</xmi:XMI>

Epsilon 1.x

If you would like to use an older (1.x) version of Epsilon, you can use this example instead, which uses a fat jar we used to produce (epsilon-1.x-kitchensink.jar) before moving all our jars to Maven Central/Sonatype.