Как получить txt-файл из jar в tomcat7

У меня есть файл txt . Я упаковал его в zip и jar, используя jar cf0 ... . Я пробовал оба в попытке заставить это работать.

models.zip/models.jar
 |
 |_subfolder
     |
     |_MyFile.txt

В некотором коде у меня есть ...

InputStream in = getClass().getClassLoader().getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

Я попытался установить путь к ...

MyFile.txt
/MyFile.txt
/subfolder/MyFile.txt
classpath:/subfolder/MyFile.txt
models.zip/subfolder/MyFile.txt
models.jar/subfolder/MyFile.txt
models.zip!/subfolder/MyFile.txt
models.jar!/subfolder/MyFile.txt

Я также попытался помещать jar/zip в WEB-INF/classes и WEB-INF/lib .

Ничего из этого не работает, in всегда равно null.

И просто, чтобы вы знали, когда я помещаю MyFile.txt в WEB-INF/classes, я могу получить все в порядке.

Пожалуйста, попробуйте проверенный ответ! Пожалуйста, не копируйте и не вставляете код из другого ответа.

2
добавлено отредактировано
Просмотры: 2
nl ja de
Есть ли подчеркивание перед именем файла? Если это так, вам нужно включить это в путь.
добавлено автор Triton Man, источник
Я беру это ваши модели. {Jar, zip} не находится в пути к классам?
добавлено автор fge, источник
@TedTrippin «Я считаю, что lib и классы оба находятся в пути Tomcat class» <- Я говорил о ваших моделях. * Файл здесь. Если он был в пути к классам, он был zip-файлом и имел расширение .jar , .getResourceAsStream() нашел бы файл.
добавлено автор fge, источник
просто чтобы быть уверенным, можете ли вы добавить точный вывод «jar tvf models.jar»?
добавлено автор BigMike, источник
@TedTrippin, может быть, в банке не содержится файл ...
добавлено автор ElderMael, источник
Можете ли вы опубликовать структуру каталогов вашего приложения? и если вы можете содержимое банки?
добавлено автор ElderMael, источник
Да, когда я получаю getResourceAsStream ("models.jar"), он возвращает банку.
добавлено автор TedTrippin, источник
fge - Я считаю, что lib и классы находятся в пути Tomcat classpath. triton - нет подчеркивания.
добавлено автор TedTrippin, источник
возможный дубликат Получить ресурс из jar
добавлено автор Brian Roach, источник

3 ответы

Попробуйте

InputStream is = getClass().getClassLoader().getResourceAsStream  ("/subfolder/MyFile.txt");

и поместите свой файл jar в WEB-INF/lib /

EDIT: вы должны доверять своему собственному коду, это фрагмент из работающего webapp моего. Класс находится в пакете «it.sft.utils.props», а файл относительных свойств упакован через ant int в ту же самую папку той же банки. Это работает безупречно.

В вашем конкретном сценарии, вероятно, у вас нет флага в вашем пути к классам

 private void loadFromProperties() throws IOException {
            if (currencies == null) {
                currencies = new Properties();
                InputStream is = this.getClass().getClassLoader().getResourceAsStream  ("/it/sft/utils/props/currencies.props");
            if (is != null) {

                currencies.load(is );

                for (String key : currencies.stringPropertyNames()) {
                    String value = currencies.getProperty(key);
                    try {
                        String [] tmp = value.split(",");
                        String code = tmp[0];
                        int decs = Integer.parseInt(tmp[1]);
                        String text = tmp[2];
                        Logger.getLogger(CurrencyResolver.class).debug("Adding " + key + " with code " + code + " [" + text + "]");
                        storeValutaIso4217(new ValutaIso4217(key, code, decs, text));
                    }catch (Exception e) {
                       //Ignore
                        Logger.getLogger(CurrencyResolver.class).warn("Cannot handle " + key + " >" + value + "<");
                    }
                }
            }
        }
    }

Или вы случайно запускаете его из каких-либо IDE (NetBeans или Eclipse)?

Просто для того, чтобы быть параноидальным: файл jar на самом деле читается пользователем пользователя tomcat, не так ли?

2
добавлено
@TedTrippin вы развертываете приложение как войну, как ухо или как каталог? код прав, и ИТ должен работать.
добавлено автор BigMike, источник
@kutschkem Я согласен с тобой.
добавлено автор BigMike, источник
@TedTrippin странно, он работает в производстве на сервере JBoss AS около 2 лет.
добавлено автор BigMike, источник
-1 Я попросил не просто скопировать и вставить. И нет, это не работает.
добавлено автор TedTrippin, источник
Просто работает под tomcat как мой собственный пользователь на окнах. Если я разворачиваю текстовый файл самостоятельно, тогда проблем нет, только когда он находится в банке/zip. И jar tvf показывает файл.
добавлено автор TedTrippin, источник
«ИТ должен работать», вы правы. Проблема заключалась в том, что в обоих классах была jar и lib :(
добавлено автор TedTrippin, источник

Я думаю, что проблема заключается в завершении / в /subfolder/MyFile.txt .

Весна ClassPathResource использует почти ту же самую операцию, которую вы используете, но javadoc указывает прямо :

Создайте новый класс ClassPathResource для использования ClassLoader. Ведущая косая черта   будут удалены, поскольку методы доступа к ресурсам ClassLoader не будут   принять его.

Таким образом, без весны это было бы:

Thread.currentThread().getContextClassLoader().getResourceAsStream("subfolder/M‌​yFile.txt");

Кроме того, ваша банка должна быть помещена в WEB-INF/lib или если вы хотите поместить только текстовый файл, поместите его в WEB-INF/classes/subfolder/.

Если вы используете весну (моя догадка, потому что вы используете псевдо-url classpath :), используйте прямо следующее:

InputStream is = new ClassPathResource("subfolder/MyFile.txt").getInputStream();
1
добавлено
Я не согласен, я всегда загружал файлы свойств, расположенные в том же источнике относительных pojos, используя ведущий «/», я никогда не использовал Spring
добавлено автор BigMike, источник
@TedTrippin mmm ... затем с завершающим косой чертой? Лол
добавлено автор ElderMael, источник
Можете ли вы его с помощью Thread.currentThread (). GetContextClassLoader (). GetResourceAs & zwnj; Stream ("вложенная папка/My & zwnj; File.txt");
добавлено автор ElderMael, источник
Как уже было сказано, я попытался поместить его в папки lib и classes. Нет, не используя весну, просто пробую разные примеры, с которыми я столкнулся.
добавлено автор TedTrippin, источник
@Mael, еще ничего
добавлено автор TedTrippin, источник

Я чувствую себя плунжером! Проблема заключалась в том, что models.jar был как в папке lib, так и в классах. Он должен быть в папке lib.

1
добавлено
Это ... было неожиданным.
добавлено автор ElderMael, источник