2016-12-02 11 views
5

Chciałbym zanegować właściwość boolowską zdefiniowaną w pom.xml.Jak zanegować właściwość w pliku pom.xml?

znaczenie, biorąc pod uwagę właściwość ${doSomething} muszę przechodzić <skip> do wtyczki, gdy wartość <skip> powinna być negacja ${doSomething}.

Jeśli wartość ${doSomething} jest nieprawidłowa, chcę pominąć. Jeśli to prawda, to nie chcę pominąć. Jakieś pomysły?

Wyjaśnienie: Nie mówię o używaniu negacji właściwości do aktywacji profilu. Po prostu chcę przekazać negację wartości boolowskiej do wtyczki.

+0

Czy możesz udostępnić bieżące polecenie, którego używasz do pominięcia włączania Zrób czegoś. – nullpointer

+0

@nullpointer To niestandardowy plugin. Zobacz '$ {download.cmake}' na https: // github.com/cmake-maven-project/cmake-maven-project. Chcę pominąć pobieranie, jeśli użytkownicy ustawią tę właściwość na false, ale wtyczka faktycznie przyjmuje negację tej wartości jako dane wejściowe (parametr ""). – Gili

+0

proszę dodać szczegóły do ​​pytania, o kontekst wtyczki twojego pom.xml i metodę wykonania, którą obserwujesz obecnie. Nie widzę '$ {download.cmake}' w podanym odsyłaczu. – nullpointer

Odpowiedz

6

Oprócz aktywacji profilu, Maven nie ma wdrożonej logiki boolowskiej. Więc jeśli chcesz zanegować właściwość, aby przekazać ją do wtyczki, musisz to zrobić samodzielnie. To jest trochę niezdarny, ale można użyć cel build-helper-maven-plugin:bsh-property, który umożliwia napisać BeanShell script i eksportu zmiennych zdefiniowanych w nim jako właściwości Mavena:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.12</version> 
    <executions> 
    <execution> 
     <id>negate-prop</id> 
     <phase>initialize</phase> 
     <goals> 
     <goal>bsh-property</goal> 
     </goals> 
     <configuration> 
     <source>dontDoSomething = !${doSomething};</source> 
     <properties> 
      <property>dontDoSomething</property> 
     </properties> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Nie można zastąpić własność, ale można zdefiniować nowy zawierający wynik negacji; w powyższym przykładzie jest to dontDoSomething. Jest to wykonywane w fazie initialize, aby pozostałe wtyczki mogły używać go jako parametru, ze standardem ${dontDoSomething}.

Można to ulepszyć, aby mieć domyślną wartość dla dontDoSomething, jeśli doSomething nie istnieje.

<source> 
    value = project.getProperties().getProperty("doSomething"); 
    dontDoSomething = value == null ? false : !Boolean.parseBoolean(value); 
</source> 

BeanShell to język skryptowy, który bardzo przypomina język Java i można korzystać z istniejących metod Java. W powyższym przykładzie właściwość "doSomething" jest pobierana z właściwości projektu (project jest wstrzykiwana przez wtyczkę w czasie oceny przy bieżącym projekcie Maven); nie jest zdefiniowany, zwracamy false, w przeciwnym razie negujemy wartość.


Jeśli doSomething jest szczególnie właściwością systemu, może być również możliwe (ab) użycie funkcji aktywacji profilu poprzez 2. Profile: jedna aktywowane przez właściwość jest true i ustawienie innego false, a druga profil robi odwrotność:

<profiles> 
    <profile> 
    <id>pro-1</id> 
    <activation> 
     <property> 
     <name>doSomething</name> 
     <value>!false</value> 
     </property> 
    </activation> 
    <properties> 
     <dontDoSomething>false</dontDoSomething> 
    </properties> 
    </profile> 
    <profile> 
    <id>pro-2</id> 
    <activation> 
     <property> 
     <name>doSomething</name> 
     <value>false</value> 
     </property> 
    </activation> 
    <properties> 
     <dontDoSomething>true</dontDoSomething> 
    </properties> 
    </profile> 
</profiles> 

to nie będzie działać, jeśli doSomething jest właściwością Maven ustawić w <properties> tagu na przykład. Musi zostać przekazana jako właściwość systemowa z mvn -DdoSomething=true|false. Odpowiedni profil zostanie aktywowany zgodnie z wartością właściwości systemowej, która zdefiniuje właściwość dontDoSomething na odwrotność. Jeśli właściwość nie zostanie zdefiniowana, będzie aktywna pro-1, ustawiając dontDoSomething na wartość domyślną false. Wszystko to jest dość brzydkie ...

+1

Czy możesz zaktualizować odpowiedź, aby zawierała pełniejszy przykład użycia dwóch profili do ustawienia wartości logicznej na wartość true lub false? – Gili

+1

@Gili Tak, właśnie edytowałem. Zauważ, że zadziała tylko wtedy, gdy 'doSomething' jest właściwością systemową, a nie tylko właściwością Maven. – Tunaki

+0

To jest w porządku (ale dzięki za wskazanie tego!) – Gili

1

Nie znam dokładnej odpowiedzi, ale myślę, że możesz spróbować następujących rzeczy, aby odwrócić wartość właściwości (od http://maven.apache.org/guides/introduction/introduction-to-profiles.html). Zadeklaruj inną właściwość, w której odwróci się wartość pierwszej właściwości:

<property> 
    <name>dontDoSomething</name> 
    <value>!${doSomething}</value> 
</property> 
+0

To nie działa, ponieważ nie mówimy tutaj o aktywacji profilu. Mówimy o definiowaniu właściwości, która zostanie przekazana do wtyczki. – Gili

+0

Nie chodzi o CO, ale JAK. Jak odwracać wartość nieruchomości? – actc

+0

Ah. Przepraszam za to :) Spróbuję teraz. – Gili

Powiązane problemy