Плагин Maven для ограничения использования определенных пакетов - PullRequest
11 голосов
/ 19 сентября 2011

Я работаю в команде из около 40 разработчиков, и я не хочу, чтобы какой-либо разработчик использовал какой-то конкретный API (точнее, java.sun.Base64), который будет использоваться любым из разработчиков, и скорее заставит их использовать альтернативыSun API в качестве проприетарного.

Существуют ли плагины для maven, с помощью которых, указав ограниченные пакеты в pom.xml, сборка будет прервана, если какой-либо из этих пакетов будет использоваться где-либо в коде??

Или есть более изящный способ сделать это ??

Спасибо

Ответы [ 8 ]

8 голосов
/ 19 сентября 2011

Вы хотите определить архитектурное правило для своего проекта, которое лучше всего обеспечивается анализом исходного кода.

Сонар теперь имеет возможность указать таких правил и отображать нарушения на панели качества проекта. Если вы хотите, чтобы сборка сломалась, это можно сделать дополнительно, включив плагин Sonar Build breaker .

Sonar действительно прост в настройке и интегрируется в процесс сборки Maven с нулевым изменением POM.

7 голосов
/ 26 февраля 2013

Посмотрите на this :

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>macker-maven-plugin</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>macker</goal>
            </goals>
          </execution>
        </executions>      
      </plugin>

, где определено правило, запрещающее импорт java.lang.System

<?xml version="1.0"?>
<macker>    
    <ruleset name="Testing rules">
        <pattern name="mypackage" class="org.codehaus.mojo.**" />
        <access-rule>
            <message>System out is bad. Use logging instead.</message>
            <deny>
                <to>
                    <include class="java.lang.System" />
                </to>
            </deny>
            <!--allow>
                <from pattern="blah" />
            </allow-->
        </access-rule>
    </ruleset>
</macker>
6 голосов
/ 06 ноября 2013

Вот плагин, который я написал для аналогичных целей.

Подробности можно посмотреть здесь: https://github.com/yamanyar/restrict-maven-plugin/wiki

Ограничить доступ от com.ya * к java.util.regex.*

<restriction>com.ya* to java.util.regex.*</restriction>

Ограничить доступ от com.ya * (кроме com.yamanyar.core. ) к java.util.regex. ,

<restriction>com.ya*,!com.yamanyar.core.* to java.util.regex.*</restriction>

Ограничьте доступ к com.ya * (кроме com.yamanyar.core. ) и com.abc.Test для java.util.regex.

<restriction>com.ya*,com.abc.Test,!com.yamanyar.core.* to java.util.regex.*</restriction>

Ограничить доступ к com.ya * (кроме com.yamanyar.core. ) и com.abc.Test для java.util.regex. (кроме java.util.regex.Matcher) <restriction>com.ya*,com.abc.Test,!com.yamanyar.core.* to java.util.regex.*,!java.util.regex.Matcher</restriction>

Ограничить доступ к com.ya * (кроме com.yamanyar.core. ) и com.abc.Test для java.util.regex. (кроме java.util.regex.Сличитель);а также ограничить com.ya * (кроме com.yamanyar.core. ) значением java.io.PrintStre .print * ()

<restriction>com.ya*,com.abc.Test,!com.yamanyar.core.* to java.util.regex.*,!java.util.regex.Matcher</restriction>
<restriction>com.ya*,!com.yamanyar.core* to java.io.PrintStre*.print*()</restriction>
1 голос
/ 21 сентября 2011

Вот код подтверждения концепции для PMD / Плагин Maven PMD .(Ограниченные классы жестко закодированы в конструкторе, но его можно настроить через свойства.)

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import net.sourceforge.pmd.AbstractJavaRule;
import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
import net.sourceforge.pmd.ast.ASTName;
import net.sourceforge.pmd.ast.SimpleJavaNode;

public class PackageRestrictionRule extends AbstractJavaRule {

    private final List<String> disallowedPackages;

    public PackageRestrictionRule() {
        final List<String> disallowedPackages = new LinkedList<String>();
        disallowedPackages.add("org.apache.");
        this.disallowedPackages = Collections
                .unmodifiableList(disallowedPackages);
    }

    @Override
    public Object visit(final ASTClassOrInterfaceType node, 
            final Object data) {
        checkPackage(node, data);
        return super.visit(node, data);
    }

    @Override
    public Object visit(final ASTName node, final Object data) {
        checkPackage(node, data);
        return super.visit(node, data);
    }

    private void checkPackage(final SimpleJavaNode node, 
            final Object data) {
        final String image = node.getImage();
        if (isDisallowedPackage(image)) {
            addViolationWithMessage(data, node, 
                    "Disallowed class or package: " + image);
        }
    }

    private boolean isDisallowedPackage(final String packageName) {
        for (final String disallowedPackageName : disallowedPackages) {
            if (packageName.startsWith(disallowedPackageName)) {
                return true;
            }
        }
        return false;
    }
}

Создайте для него новый проект maven и используйте этот проект в качестве зависимости от PMD.плагин в вашем проекте:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <targetJdk>1.6</targetJdk>
        <rulesets>
            <ruleset>packagerestrictionrule.xml</ruleset>
        </rulesets>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>PackageRestrictionRule</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</plugin>

Кроме того, плагину PMD необходим правильный XML-файл набора правил для класса правил.На веб-сайте PMD есть пример: http://pmd.sourceforge.net/howtowritearule.html. Просто поместите его в папку src / main / resources в вашем проекте PackageRestrictionRule, и плагин найдет его в пути к классам.

1 голос
/ 19 сентября 2011

Вы можете проверить, какие классы загружены в ваш загрузчик классов, и вызвать ошибку, если найдете что-то из java.sun.Base64.

Это похоже на работу: http://www.javaworld.com/javaworld/javaqa/2003-07/02-qa-0725-classsrc2.html

1 голос
/ 19 сентября 2011

Мне не известен плагин Maven для этого, но я бы подумал, что вы могли бы сделать то же самое с аспектами (и, следовательно, использовать плагин Maven / Aspectj).Aspectj имеет конструкцию объявление ошибки , которая может быть полезна.Это может вызвать ошибку, если он обнаружит pointcut, который использует ваши запрещенные классы.

Также http://www.eclipse.org/aspectj/doc/released/progguide/semantics-declare.html#warnings-and-errors

Одним из ограничений этого подхода является статический анализ, и поэтому он не сможетперехватывать любые «умные» вызовы вашего черного списка класса / пакета.

0 голосов
/ 24 августа 2016

Одним из простых вариантов может быть использование «родительского» pom для определения всех ваших сторонних jar-файлов с версиями в разделе «Dependency Management» и их использование в дочерних pom.Несмотря на то, что эта модель не запрещает использование конкретного jar-файла, PM или архитектор будет иметь простой способ управления зависимостями.Как только это будет сделано, мы можем просто сказать разработчикам использовать только зависимости, используемые в родительском pom.

0 голосов
/ 20 сентября 2011

Это предположение противоположно «изящному»; это полная помеха: может быть достаточно просто написать что-нибудь, чтобы поместить его в фазу процесса-источника сборки ... вы можете (например) заменить любые случаи "sun.Base64" на некоторый (недопустимый Java) текст указывая на проблему. Это может привести к сбою сборки по крайней мере.

...