Самый простой способ получить файл в тестовом примере JUnit от Maven - PullRequest
4 голосов
/ 11 февраля 2010

Мой тестовый код в Maven-проекте B (который является дочерним для проекта A) имеет что-то вроде

String filePath = "src/main/webapp";
//do something with the filePath

Приведенный выше тестовый пример работает нормально, когда я запускаю проект от дочернего (т. Е. Уровня B), но когда я запускаю из родительского проекта A (т. Е. Выполняю установку mvn на родительском уровне), это не удается, потому что, очевидно, нет папки с именем «src / main / webapp» на родительском уровне (однако он доступен на дочернем уровне).

Я знаю, что мог бы сделать некоторые проверки кода, если тестовый пример выполняется из родительского / дочернего модуля, но, очевидно, я хочу знать, что другие сделали, когда у них возникла эта проблема?

И нет, я не могу вместо этого использовать classpath (по разным скучным причинам).

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

ОБНОВЛЕНИЕ (12 февраля) - У меня есть файл web.xml в папке webapp и я создаю в тестовом случае сервер Jetty, используя этот файл web.xml. В идеале src / main / webapp не помещается в путь к классам. Он используется плагином WAR для упаковки WAR. Теперь я попробовал альтернативный вариант, где я поместил свой файл web.xml в каталог src / main / resource / console-webapp / WEB-INF / web.xml и изменил атрибут webXml в плагине maven war. Кажется, это решает мою проблему. Однако в выходной WAR-файле у меня есть web.xml и другой избыточный web.xml (который был скопирован, потому что он находится в пути к классам).

Я попробовал "packageExclude" и "webResources / exclude" и получил военный плагин для пропуска второго web.xml, но все равно каталог "console-webapp" копируется (хотя и пуст). Есть ли способ сказать плагину maven war полностью игнорировать каталог (т. Е. Каков для этого шаблон муравья?)

Ответы [ 2 ]

7 голосов
/ 11 февраля 2010

Соглашения Maven 2 гласят, что все ресурсы тестирования, включая файлы, такие как файл, который вы пытаетесь использовать в своем тесте, должны храниться в папке src/test/resources. Если вы соблюдаете это соглашение, вы сможете получить свой файл непосредственно из classpath. Эти ресурсы не будут включены в окончательную упаковку (JAR, WAR, EAR ...).

Конечно, вы можете изменить каталог и затем указать новый каталог ресурсов тестирования в вашем pom.xml:

<build>
    <testResources>
        <testResource>
            <directory>...</directory>
        </testResource>
    </testResources>
    ...

В своем вопросе вы указали, что не можете использовать путь к классам. Почему так?

2 голосов
/ 15 февраля 2010

Является ли файл, к которому вы пытаетесь получить доступ, в тестовом пути к классам? Если да, то как насчет:

public class IOUtils {

  public URL getResourceAsURL(String resource) {
    ClassLoader cl = getClass().getClassLoader();
    return cl.getResource(resource);
  }


  public static InputStream getResourceAsStream(String resource) throws IOException  {
    ClassLoader cl = getClass().getClassLoader();
    InputStream in = cl.getResourceAsStream(resource);

    if (in == null) 
      throw new IOException("resource \"" + resource + "\" not found");

    return in;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...