с maven-javadoc-plugin, как загрузить класс, в котором содержится ссылка на taglet?

Я разработал специальный тег javadoc, который использует отражение через API для получения информации о классе, в котором есть ссылка на тег. Он загружает класс с "Class.forName(String)".

Мне удалось заставить это работать в проекте для самого теглета, вплоть до запуска интеграционных тестов с использованием «ToolProvider.getSystemDocumentationTool()» и проверки полученного содержимого.

Теперь я установил этот артефакт на наш сервер связи и пытаюсь сослаться на него из класса, созданного с помощью Maven и maven-javadoc-plugin.

Когда я впервые запустил сборку, в которой мой тег упоминался в «Foo.java», я увидел исключение ClassNotFound в коде своего теглета, говорящее, что ему не удалось найти указанный класс.

Это говорит мне о том, что он попадает в мой код теглета, но не может загрузить файл класса для рассматриваемого класса. Это немного иронично, поскольку единственный способ попасть сюда — это найти и проанализировать исходный файл, связанный с классом.

Затем я отредактировал конфигурацию maven-javadoc-plugin, добавив блок «additionalDependencies», указав артефакт, содержащий файл класса, который ссылается на тег.

Я также установил флаг «verbose» и увидел, что в результирующем выводе, когда он напечатал «search path for class files», я нашел банку артефакта с рассматриваемым классом в конце этого списка.

Тем не менее, я все еще получаю сообщение об ошибке.

Что еще здесь может пойти не так?

Вот некоторые выдержки из соответствующего кода:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.4</version>
            <configuration>
                <verbose>true</verbose>
                <additionalDependencies>
                    <additionalDependency>
                        <groupId>our.group.id</groupId>
                        <artifactId>our.artifact.id</artifactId>
                        <version>${current.pom.version}</version>
                    </additionalDependency>
                </additionalDependencies>
                <additionalparam>-Xdoclint:none</additionalparam>
                <taglets>
                    <taglet>
                        <tagletClass>packagepath.taglet.ValidationConstraintsTaglet</tagletClass>
                    </taglet>
                    <taglet>
                        <tagletClass>packagepath.taglet.ValidationConstraintsCombinedTaglet</tagletClass>
                    </taglet>
                </taglets>
                <tagletArtifact>
                    <groupId>our.group.id.taglets</groupId>
                    <artifactId>validationJavadocTaglet</artifactId>
                    <version>0.0.1-SNAPSHOT</version>
                </tagletArtifact>
            </configuration>
            <executions>
                <execution>
                    <id>module-javadoc-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <show>protected</show>
                        <detectLinks>false</detectLinks>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Вот часть кода класса Taglet, которая показывает загрузку содержащего его класса:

@Override
public String toString(Tag tag) {
    String  className   = tag.holder().toString();

    StringBuilder   sb  = new StringBuilder();
    sb.append("<dt><b>Validation Constraints</b></dt>");
    sb.append("<dd>");
    sb.append("<table border=1><thead><tr><th>Property</th><th>Message</th></tr></thead>");
    sb.append("<tbody>");

    try {
        Class<?>    clazz   = Class.forName(className);

Когда я запускаю сборку, я вижу этот вывод:

Generating C:\...\...\target\apidocs\help-doc.html...
[done in 2593 ms]
[WARNING] Javadoc Warnings
[WARNING] java.lang.ClassNotFoundException: ...Foo
[WARNING] at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[WARNING] at java.lang.Class.forName0(Native Method)
[WARNING] at java.lang.Class.forName(Class.java:264)
[WARNING] at ....taglet.ValidationConstraintsTaglet.toString(ValidationConstraintsTaglet.java:69)

И я заметил следующую строку в выводе (подробный включен):

[search path for class files: C:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar,...,C:\...\our.artifact.id\target\our.artifact.id-2.7.0-SNAPSHOT.jar]

Я проверил банку в конце списка и убедился, что рассматриваемый класс там.


person David M. Karr    schedule 17.07.2017    source источник


Ответы (1)


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

Что имеет значение, чего я не ожидал, так это добавить зависимость как еще один «tagletArtifact». Я полагаю, если вы думаете об этом, это зависимость, необходимая теглету. Когда я добавил GAV для артефакта, который создает сам POM, это, наконец, сработало.

person David M. Karr    schedule 19.07.2017