DTD отображаются в целевом пути проекта в Eclipse, но не при использовании через командную строку Maven.

Я не был уверен, какое название лучше, поэтому, если у кого-то есть лучшее предложение, пишите прочь.

Я не уверен, какую информацию я должен предоставить, поэтому я расскажу вам, что происходит.

У меня есть несколько модульных тестов, которые отлично проходят в Eclipse. В этих тестах есть некоторый XML, который проверяется на основе специально созданного DTD (слегка модифицированный Apelon DTS DTSConcept, если кто-то знаком). В eclipse, когда я запускаю эти тесты, я вижу в своем целевом пути для проекта, что появляются dtds.

Итак, dir1/dir2/dtds/myDtd.dtd существует в целевом пути проекта.

Однако, если я запускаю модульные тесты в командной строке с помощью maven (mvn clean test), эти тесты завершаются ошибкой из-за исключения MalformedURLException. Я смог избавиться от проверки DTD и пройти тесты, так что я знал, что это как-то связано с этим. После многих попыток по какой-то причине я посмотрел на целевой путь проекта. Теперь dir1/dir2/dtds/myDtd.dtd НЕ существует. Кажется, поэтому я получаю исключение - файл не существует.

Я понимаю, что это может быть слишком расплывчато, но есть ли что-нибудь, что вы можете подумать о том, почему у меня могут быть разные результаты, работающие в Eclipse, по сравнению с использованием командной строки Maven?

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

Спасибо за любую помощь.

EDIT: Хорошо, кажется, проблема в том, что maven просто не копирует DTD в целевой каталог при сборке. Я могу погуглить/задать отдельный вопрос для этого, но как я могу гарантировать, что Maven правильно скопирует эти файлы?


person AHungerArtist    schedule 12.07.2010    source источник
comment
Можете указать полный путь к каталогу dir1/dir2/dtds/myDtd.dtd?   -  person Georgy Bolyuba    schedule 13.07.2010
comment
Не уверен, что вы спрашиваете, могу ли я указать полный путь в приложении, или вы хотите увидеть полный путь? C:\Users\myname\workspace\terminology-dts-extensions\target\classes\com\work\hin\dts\dtd\query Фактический путь в DTD: work.com/hin/dts/dtd/query/myDtd.dtd и использует преобразователь сущностей apelon для получения файла из там.   -  person AHungerArtist    schedule 13.07.2010


Ответы (2)


Учитывая, что файл является DTD (а не ресурсом Java), я думаю, что было бы лучше поместить его в папку resources/META-INF проекта maven по умолчанию.

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

Также потребуется изменить ваш файл XML, чтобы он указывал на новое местоположение.

Вот как это будет выглядеть в типичной структуре проекта maven:

my-app
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- app
    |   |               `-- App.java
    |   `-- resources
    |       `-- META-INF
    |           `-- application.properties
    [            -- myDtd.dtd
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java
person Guillermo Moscoso    schedule 12.07.2010
comment
Спасибо. Я знаю об этом (и именно туда мы помещаем другие ресурсы, которые используем), но я использую стороннюю библиотеку, которая требует, чтобы они находились в определенном месте для использования. В противном случае, вы правы, было бы гораздо проще их туда поставить. - person AHungerArtist; 13.07.2010
comment
На самом деле это применимо, пока я расширяю свою папку ресурсов, чтобы включить каталог (например, main/resources/dir1/dir2/blah). Так что я отмечу это правильно с этой оговоркой. - person AHungerArtist; 13.07.2010
comment
Я вижу, я этого не осознавал. Кстати, вы используете плагин m2eclipse (плагин eclipse, а не плагин maven)? Если вы делаете сборку eclipse, она должна вести себя так же, как сборка maven. Это должно избежать исходной проблемы получения разных результатов при использовании одного или другого. - person Guillermo Moscoso; 13.07.2010
comment
Я не использовал это, но это определенно хорошее предложение. Спасибо. - person AHungerArtist; 14.07.2010

Что ж, я разобрался :) На случай, если кто-то столкнется с похожей проблемой и не сможет изначально разобраться с плагином (как я), вот что сработало для меня:

<plugin>
            <!-- Necessary for maven to copy the DTDs to the correct directory. -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <!-- here the phase you need -->
                    <phase>compile</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/classes/com/work/hin/dts/dtd/query</outputDirectory>
                        <resources>
                            <resource>
                                <directory>src/main/java/com/work/hin/dts/dtd/query</directory>
                                <includes>
                                    <include>**/*.dtd</include>
                                </includes>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
person AHungerArtist    schedule 12.07.2010