среда, 17 марта 2010 г.

Доступ из проектов на Java к Windows Shares из под Linux

Иногда возникает задача доступа к Windows Shares из проектов на java в не зависимости от операционной системы на которой эти проекты запускаются.



В частном случае, если программа на java запускается под Windows, и в програме имеется обращение к файлу по естественному для Windows пути вида \\machine\share\folder\file.ext, то проблем с доступом не будет, так как java отдает доступ к такому файлу на откуп операционной системе, на которой она запущена.

Как пример, можно привести следующий код:

import java.io.File;
import java.io.File;

public class WindowsClient {
    public static void main(String[] args) {
        try {
            File file = new File(args[0]);
            if (file.exists()) {
                System.out.println("File exists");
            } else {
                System.out.println("File doesn't exist");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Результат запуска под Windows:
c:\>java -jar WindowsClient.jar "\\windows-pc\Public\Documents\JH.Catch22.txt"
File exists
c:\>

Результат запуска под Linux:
[root@linux-pc tmp]# java -jar WindowsClient.jar "\\windows-pc\Public\Documents\JH.Catch22.txt"
File doesn't exist
[root@linux-pc tmp]#

Как видим, такой способ не работат на Linux, так как такой доступ не является нативным для него. Унифицированный доступ к Windows Shares можно сделать подключив библиотеки jcifs: http://jcifs.samba.org/.

Для подключения:
1. Берем последнюю версию jcifs-xxx.jar из http://jcifs.samba.org/src/.
2. Добавляем ее в classpath.
3. Меняем программу под работу с URL.
import java.net.URL;

public class UniversalClient {

 public static void main(String[] args) throws Exception {
  try {
   jcifs.Config.registerSmbURLHandler();
   URL url = new URL(args[0]);
   if (url.openConnection().getContentLength() > 0) {
    System.out.println("Content by URL have been detected");
   } else {
    System.out.println("Content by URL have not been detected");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
4. При запуске добавляем дополнительный java параметр
-Djava.protocol.handler.pkgs=jcifs

Результаты запуска под Windows:
c:\>java -jar UniversalClient.jar "smb://domain;login:mypassword@windows-pc/Public/Documents/JH.Catch22.txt"
Content by URL have been detected 
c:\> 

Результаты запуска под Linux:
[root@linux-pc tmp]# java -jar UniversalClient.jar "smb://domain;login:mypassword@windows-pc/Public/Documents/JH.Catch22.txt" 
Content by URL have been detected
[root@linux-pc tmp]# 

Множество примеров для работы с jcifs можно найти здесь: http://jcifs.samba.org/src/examples/

Комментариев нет:

Отправить комментарий