# Apache Ivy - Plattform-spezifische Abhängigkeiten in der "ivy.xml" parametrisieren



## dtr84 (7. Jan 2021)

Hallo,

ich benutze in einem Projekt Apache Ivy um die Abhängigkeiten zu verwalten. Aktuell sieht meine "ivy.xml" in etwa so aus:


```
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="net.weyland.test" module="jfx11"/>
    <dependencies>
        <dependency org="org.openjfx" name="javafx-base" rev="11.0.2">
            <artifact name="javafx-base" e:classifier="win"/>
            <artifact name="javafx-base" e:classifier="linux"/>
            <artifact name="javafx-base" e:classifier="mac"/>
        </dependency>
    </dependencies>
</ivy-module>
```

Die einzelenen `<artifact>` Angaben sind hier notwendig, weil sonst gar keine JAR Files heruntergeladen werden. Im Moment werden so aber _immer_ alle JAR Files für _alle_ Plattformen eingebunden, was eigentlich redundant ist! Die "ivy.xml" für jede Plattform anpassen zu müssen ist aber unschön. Genauso möchte man nicht pro Plattform eine separate "ivy.xml" pflegen müssen. Was man sich eigentlich wünschen würde, wäre etwas in der Form:


```
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="net.weyland.test" module="jfx11"/>
    <dependencies>
        <dependency org="org.openjfx" name="javafx-base" rev="11.0.2">
            <artifact name="javafx-base" e:classifier="${platform}"/>
        </dependency>
    </dependencies>
</ivy-module>
```

...wobei die Variable `${platform}` automatisch für die aktuelle Plattform stehen soll. Ist so etwas mit Ivy irgendwie möglich ❓

Danke und viele Grüße!


----------



## dtr84 (12. Jan 2021)

Okay, falls es jemanden interessiert, ich habe inzwischen folgende Lösung gefunden:


```
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="net.weyland.test" module="jfx11"/>
    <dependencies>
        <dependency org="org.openjfx" name="javafx-base" rev="11.0.2">
            <artifact name="javafx-base" e:classifier="${jfx.platform}"/>
        </dependency>
    </dependencies>
</ivy-module>
```

Allerdings kann der Platzhalter `${jfx.platform}` nicht direkt in der *ivy.xml* definiert werden. Jedenfalls habe ich keine Möglichkeit gefunden. Es kann aber, wenn man mit Ant arbeitet, in der *build.xml* als Property definiert werden. Zum Beispiel wie folgt:


```
<condition property="jfx.platform" value="mac">
    <os family="mac"/>
</condition>
<condition property="jfx.platform" value="linux">
    <os family="unix"/>
</condition>
<condition property="jfx.platform" value="win">
    <os family="windows"/>
</condition>
```

Bleibt das Problem, wenn man die _selbe_ *ivy.xml* auch im Eclipse-Projekt verwenden möchte, weil dort direkt die Ivy-Datei ausgewertet wird (über das IvyDE-Plugin), *ohne* "Vorverarbeitung" durch Ant. Dann ist natürlich das Property `${jfx.platform}` _nicht_ definiert 😕

Habe es jetzt gelöst, indem ich mir in der *ivysettings.xml* einen _Default_-Wert gesetzt habe:


```
<ivysettings>
    <include url="${ivy.default.settings.dir}/ivysettings.xml"/>
    <property name="jfx.platform" value="win" override="false"/>
</ivysettings>
```

Wichtig ist, dass man in Eclipse die *ivysettings.xml* explizit einbinden muss (über die Ivy-Settings), und dass man bei dem Default-Wert `override="false"` setzt, damit Ant trotz der *ivysettings.xml* immer noch das Property _dynamisch_ setzten kann.

Viele Grüße.


----------

