2012-05-24 3 views
0

Как я могу использовать ресурсы из других модулей maven? Моя цель - предоставить AbstractImportClass, а также импортируемые файлы в определенном модуле maven. И используйте этот модуль в других модулях, расширяющих этот класс.Maven использует ресурсы из других модулей?

Скажем ModuleA содержит src/main/java/MyAbstractImportClass.java и src/main/resources/MyImport.csv

Я теперь хочу использовать абстрактный класс импорта в ModuleB. Вернее, я буду расширять его, использовать abstract-fileimport и несколько пользовательских функций. Затем ModuleC также использует импорт тезисов и некоторые пользовательские функции.

Проблема: импорт в абстрактном классе идет с reader и InputStream. Когда я выполняю только ModuleA, все в порядке.

Но когда я попытался включить модуль через maven pom, а затем расширьте модуль, чтобы вызвать импорт, тогда я получаю NullPointerException в строке, где используется читатель.

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

Но как я мог вместо этого использовать это?


Update:

Модуль A:

src/main/java/path/to/MyClassA.java 
src/main/resources/path/to/test.txt 

abstract class MyClassA { 
    public static String TESTFILE = test.txt; 

    List<String> doImport(String filename) { 
     InputStream fileStream = resourceClass.getResourceAsStream(filename); 
     //some precessing 
     return list; 
    } 
} 

Модуль B:

src/main/java/path/to/MyClassB.java 

class MyClassB implements MyClassA { 
    List<String> list = doImport(TESTFILE); 
} 

Если я ставлю MyClassB в той же директории, как А, то все работает отлично. Если я создаю B в собственном модуле, я получаю NullPointer для InputStream, что означает, что файл не найден.

ответ

0

Я не думаю, что ваша проблема связана с Maven вообще. Class.getResourceAsStream() разрешает относительные пути относительно объекта класса, на который вы его называете. Поэтому, если вы используете этот метод в абстрактном классе, каждый его подкласс может искать ресурс в другом месте.

Например, данные три класса:

Супер:

package com.foo; 
public class Super { 
    { System.out.println(getClass().getResourceAsStream("test.properties")); } 
} 

SUB1, подкласс супер:

package com.foo.bar; 
import com.foo.Super; 
public class Sub1 extends Super {} 

SUB2, другой подкласс:

package com.foo.bar.baz; 
import com.foo.Super; 
public class Sub2 extends Super {} 

если ты создайте супер, он будет искать ресурс classpath «/com/foo/test.properties», потому что так решается путь «test.properties» относительно класса com.foo.Super. Если вы создадите Sub1, он будет выглядеть вместо этого в «/com/foo/bar/test.properties», а для экземпляра Sub2 он будет выглядеть в «/com/foo/bar/baz/test.properties», ,

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

+0

Итак, мой абсолютный путь: 'de/my/path/to/Super/test.properties'? или с началом '/ de/my ...'? Было бы достаточной абстракцией, если Super-класс может извлечь файл, который содержится в соответствующих папках ресурсов/пути/в/файл. – membersound

+1

Может быть полный путь, начинающийся с/или относительный путь, начиная с местоположения вашего «resourceClass». – maximdim

+0

Да, абсолютные пути pathpath начинаются с '/'. Если вы хотите использовать относительный путь от Super, просто обязательно используйте 'Super.class.getResourceAsStream()', а не 'getClass(). GetResourceAsStream()'. Последний является полиморфным, первый - нет. –

0

Не совсем понятно, что делает ваш код. Не могли бы вы предоставить образец того, как вы читаете ресурс? Если вы сделаете это правильно - получив InputStream из файла ресурсов в classpath, проблем не возникнет. Вы можете начать с проверки того, что ModuleA.jar содержит ваш файл ресурсов.

+0

обновление выше с некоторым кодом псевдонима. Я тоже думаю, что проблем не должно быть, но obv есть. И я даже не знаю, смогу ли я сделать это таким образом. – membersound

+0

Может быть абсолютный путь, начинающийся с/или относительный путь, начиная с местоположения вашего «resourceClass». – maximdim

0

Вы должны проверить:

  1. Модуль B зависит от модуля А в pom.xml
  2. переданному в параметре «имя файла» начинается с «/», то есть сказать, «имя файла» параметр «/path/to/test.txt», отличный от «path/to/test.txt»

Ваша программа должна работать, если эти два условия удовлетворительны.

Смежные вопросы