Have you looked at the ivy task buildlist?
You could use this to control the order in which your 3 modules are built. As each module is built it can publish to a local repository, ensuring that the jar is present in time for the next module in the chain.
build.xml
ivysettings.xml
--> module1 --> build.xml
ivy.xml
--> module2 --> build.xml
ivy.xml
--> module3 --> build.xml
ivy.xml
You settings file can be shared by all projects. It states that the modules you build are available locally, everything else is from the default repository available to all users of your project (In this case Maven)
<ivysettings>
<settings defaultResolver="maven2"/>
<resolvers>
<ibiblio name="maven2" m2compatible="true"/>
<filesystem name="local">
<ivy pattern="${local.rep.dir}/.."/>
<artifact pattern="${local.rep.dir}/.."/>
</filesystem>
</resolvers>
<modules>
<module organisation="org.me" name="module1" resolver="local"/>
<module organisation="org.me" name="module2" resolver="local"/>
..
</modules>
</ivysettings>
Finally when you publish externally you can use the ivy install task to copy the modules you've already published locally into the final repository location