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

dtr84

Mitglied
Hallo,

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

XML:
<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:

XML:
<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

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

XML:
<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:

XML:
<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:

XML:
<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.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben