Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с доступом к внутренним папкам jar файла 
:(
    Опции темы
kkin
Дата 24.6.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет



Добрый день.

Был разработан класс который устанавливает соединение по SSL и обрабатывает данные.
Вот так он выглядит 
Код

                           //Устанавливаем новое хранилище 
        System.setProperty("javax.net.ssl.trustStore", "cer" + File.separator+ "test.kz");
        System.setProperty("javax.net.ssl.trustStorePassword", "123456");

  try{
       url = new URL ("https://adress/bla_bla_bla.asmx");
       SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
      sock = (SSLSocket)factory.createSocket(url.getHost(), url.getDefaultPort());  

    }
    catch (Exception e) {
          System.out.println("Error connect " +e );
    }

// peredaem dannie 
bwr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"utf-8"));


Из кода видно, что проверка сертификатов производиться в сравнение с ключами доверенными в системе. 
System.setProperty("javax.net.ssl.trustStore", "cer" + File.separator+ "test.kz");

Если все это запустить как отдельный класс все работает. 
Но если все это упаковать в  jar файл то при вызове этого jar файла появляется ошибка о том что папка cer и соответственно файл "test.kz"
не найдены так как эта папка ищется в каталоге вызывающего класса.

Как мне прописать что бы данные искались в jar файле и его вложенной папке ??? 


PM   Вверх
LSD
Дата 24.6.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Попробуй:
Код

URL keyStoreUrl = Thread.currentThread().getContextClassLoader().getResource("/cer/test.kz");
System.setProperty("javax.net.ssl.trustStore", keyStoreUrl.toString());



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kkin
Дата 24.6.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет



Не помогло при 
URL keyStoreUrl = Thread.currentThread().getContextClassLoader().getResource("/cer/test.kz");
Ни чего не добавляется переменная keyStoreUrl остается равной null 

java.lang.NullPointerException
PM   Вверх
Stolzen
Дата 24.6.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Попробуйте так
Код

URL url = someObject.getClass().getResource("ii.png");
System.out.println(url.toString());
InputStream is = url.openStream();
while (is.read() != -1);
System.out.println("Done");


Код

$ java -jar tst.jar 
jar:file:/home/user/workspace/Test/tst.jar!/tst/ii.png
Done


Ресурс должен находится в одной папке с классом для someObject


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
kkin
Дата 27.6.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет





в общем ситуация в следующем 
.getClass().getResource("ii.png"); вообще не работает  в моем проекте 
так как getClass нет такого метода.

Все упростил и для наглядности  привожу пример.

Класс, который читает данные из файла, который в дальнейшем будет упакован jar файл.

Код

package com.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class read_file {

    public static void start_read (String path){
        //public static void main (String arg[]){
           BufferedReader reader = null;
            String line;
            try {
             reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "Cp1251"));
                             
            } catch (IOException e) {
                System.out.println("e " + e);
            }
            
            try {
                while ((line = reader.readLine()) != null) {
                    System.out.println("File: " + line);
                }
            } catch (IOException e) {
                System.out.println("e " + e);
            }
    }

}



Далее код программы которая импортирует скопилированный jar файл  

Код

import com.test.read_file;
public class read_jar {
    public static void main(String[] args) {
        System.out.println("-----------------");
            com.test.read_file.start_read("cer/test.kz");
    }

}



При выполнении данного кода вылетает ошибка 
e java.io.FileNotFoundException: cer\test.kz (Системе не удается найти указанный путь)

Добавил к теме еще свой jar файл  


Это сообщение отредактировал(а) kkin - 8.7.2011, 09:00

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  JAR_READ.jar 2,00 Kb
PM   Вверх
Stolzen
Дата 27.6.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(kkin @  27.6.2011,  15:17 Найти цитируемый пост)
.getClass().getResource("ii.png"); вообще не работает  в моем проекте 

Как нету? У любого объекта должно быть. Покажите, как используете. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
kkin
Дата 28.6.2011, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет



Цитата(Stolzen @ 27.6.2011,  14:59)
Цитата(kkin @  27.6.2011,  15:17 Найти цитируемый пост)
.getClass().getResource("ii.png"); вообще не работает  в моем проекте 

Как нету? У любого объекта должно быть. Покажите, как используете.

Пробовал делать вот так в классе public class read_file 

Код

     Object x = new read_file();
            System.out.println(x.getClass().getResource("cer//test.ks"));
            System.out.println(read_file.class.getClassLoader().getResource("cer//test.ks"));
            System.out.println(read_file.class.getResource("cer//test.ks"));


на что везде получаю NULL
PM   Вверх
Stolzen
Дата 28.6.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(kkin @  28.6.2011,  10:19 Найти цитируемый пост)
System.out.println(x.getClass().getResource("cer//test.ks"));

Путь должен быть относительным этого класса. Можете поместить свой test.ks в папку, в которой лежит исходник класса read_file, оттуда он найдется. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Alexandr87
Дата 28.6.2011, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



на край можно будет перед вызовом SSL связанных методов, распоковать этот файл во временную директорию
PM Jabber   Вверх
kkin
Дата 1.7.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет



Цитата(Stolzen @ 28.6.2011,  09:31)
Цитата(kkin @  28.6.2011,  10:19 Найти цитируемый пост)
System.out.println(x.getClass().getResource("cer//test.ks"));

Путь должен быть относительным этого класса. Можете поместить свой test.ks в папку, в которой лежит исходник класса read_file, оттуда он найдется.

Точно, переложил файл в папку с классами, стал находить этот файл вот что пишет при нахождении 
jar:file:/C:/Users/clamp/Desktop/kkkkkkkkkkkk/JAR_READ.jar!/com/test/test.ks


Теперь как быть с доступом к этому файлу ???
пытался передать всю строку или просто путь ни чего не работает 

reader = new BufferedReader(new InputStreamReader(new FileInputStream(read_file.class.getResource("test.ks")+""), "Cp1251"));

как правильно передать путь к файлу???
PM   Вверх
Stolzen
Дата 1.7.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(kkin @  1.7.2011,  13:57 Найти цитируемый пост)
как правильно передать путь к файлу??? 

Ну не совсем путь, но если файл нужно считать, то так:

Цитата(Stolzen @  24.6.2011,  16:19 Найти цитируемый пост)
InputStream is = url.openStream();





--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
XoJIoD
Дата 3.7.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



Попробуй getResourceAsStream.

PM MAIL   Вверх
kkin
Дата 8.7.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.8.2010

Репутация: нет
Всего: нет



 Благодарю всех за помощь !!! 

Теперь все работает, если нужно считать содержимое файла. 
Переложил файл в папку с классами. 
Ниже привожу рабочий код


Код

        BufferedReader reader = null;
        String line;
        try {
            // System.out.println(new File(".").getCanonicalPath());
            URL url = read_file.class.getResource("test.ks");
            reader = new BufferedReader(new InputStreamReader(url.openStream()));
            System.out.println(url);
        } catch (Exception e) {
            System.out.println("e " + e);
        }
        try {
            while ((line = reader.readLine()) != null) {
                System.out.println("File: " + line);
            }
        } catch (IOException e) {
            System.out.println("e " + e);
        }
    }


В моем же случае  сюда  System.setProperty("javax.net.ssl.trustStore",keyStoreUrl );  вместо keyStoreUrl необходимо передать путь до файла.
Если использовать URL keyStoreUrl = jar_send_post_soket.class.getResource("test.ks"); То путь выглядит следующим образом 
file:/C:/Users/гы/Desktop/kk/JAR_test.jar!/com/test/test.ks 
И когда начинается сверка сертификата данный файл не находиться. 
КАК РЕШИТЬ ??? 



Это сообщение отредактировал(а) kkin - 25.7.2011, 11:13
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.