2011-01-13 2 views
1

Я пишу небольшое приложение веб-службы Java EE 6, предназначенное для преобразования файлов ESRI Shape и передачи данных в другое приложение.Почему geotools бросает MathTransformFactory при запуске как часть приложения Java EE 6?

У меня есть приложение, работающее нормально как приложение командной строки. Однако, перенося код, он начал выдавать исключение во время работы на сервере Glassfish.

Код проверки, чтобы увидеть, если тип координат проекция является действительным проекция нашего унаследованного приложения и должны возвращать логическое значение:

/** 
    * Validates that the shape file is using one of the valid coordinate systems. Returns true if 
    * the coordinate system is valid. 
    * 
    * @param shpFilePath The path to the shape files. 
    * @return 
    */ 
    public boolean validCoordinateSystem(String shpFilePath) { 
     try { 
      ShpFiles shapeFiles = new ShpFiles(shpFilePath); 

      PrjFileReader fileReader = new PrjFileReader(shapeFiles); 

      CoordinateReferenceSystem coordSystem = fileReader.getCoodinateSystem(); 

      for (int i = 0; i < this.acceptedCoordinateSystems.length; i++) { 

       if (this.acceptedCoordinateSystems[i].equalsIgnoreCase(coordSystem.getName().toString())) { 
        return true; 
       } 

      } 
      fileReader.close(); 

     } catch (MalformedURLException ex) { 
      Logger.getLogger(GeoTools.class.getName()).log(Level.SEVERE, null, ex); 

      return false; 
     } catch (IOException ioe) { 

      Logger.getLogger(GeoTools.class.getName()).log(Level.SEVERE, null, ioe); 

      return false; 

     } catch (Exception nex){ 

      Logger.getLogger(GeoTools.class.getName()).log(Level.SEVERE, null, nex); 

      return false; 
     } 

     return false; 
    } 

Этот код прекрасно работает нормально как приложение командной строки. Однако при выполнении этого метода в GlassFish я получаю следующую трассировку стека:

org.geotools.factory.FactoryNotFoundException: No factory of kind "MathTransformFactory" found. 
     at org.geotools.factory.FactoryRegistry.getServiceProvider(FactoryRegistry.java:374) 
     at org.geotools.factory.FactoryCreator.getServiceProvider(FactoryCreator.java:143) 
     at org.geotools.referencing.ReferencingFactoryFinder.getFactory(ReferencingFactoryFinder.java:193) 
     at org.geotools.referencing.ReferencingFactoryFinder.getMathTransformFactory(ReferencingFactoryFinder.java:503) 
     at org.geotools.referencing.factory.ReferencingObjectFactory.getMathTransformFactory(ReferencingObjectFactory.java:152) 
     at org.geotools.referencing.factory.ReferencingObjectFactory.createFromWKT(ReferencingObjectFactory.java:1084) 
     at org.geotools.data.shapefile.prj.PrjFileReader.<init>(PrjFileReader.java:78) 
     at com.spectrum.demeter.utils.GeoTools.validCoordinateSystem(GeoTools.java:61) 
     at com.spectrum.demeter.ejb.Converter.addSurveyToDatabase(Converter.java:117) 
     at com.spectrum.demeter.ws.SurveyManager.convertShpToDb(SurveyManager.java:76) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.glassfish.webservices.InstanceResolverImpl$1.invoke(InstanceResolverImpl.java:137) 

Я проверить, чтобы убедиться, что у меня есть все geotools.jar файлы, добавленные в проект, который мне нужен, однако я не уверен, что вызвав эту ошибку и (хотя я думаю, что я мог ее пропустить) не может найти ничего в документах или api.

Любая помощь в устранении этой проблемы была бы фантастической.

Спасибо, Грант.

+0

Простое обновление кода отлично работает как единичный тест? Я думаю, что это имеет какое-то отношение к серверу Glassfish, но не может понять, почему. –

+0

Мы попали в эту же ошибку при запуске Geotools в Hadoop. Я не знаю, является ли это идеальным решением, но мы решили это, используя плагин maven-shade для упаковки наших зависимостей с нашим hadoop-job.jar, а не с использованием геотекстов как разделяемой библиотеки через распределенный кеш. – arcdrag

ответ

2

GeoTools использует плагиновую систему интерфейса Java Service Provide Interface (SPI); это зависит от волшебной директории в каждом файле jar (META_INF/servies /). В этом каталоге перечислены все классы плагина, доступные в банке; в этом случае реализация MathTransformFactory).

Проблема в том, что в некоторых средах (обычно OSGi) доступ к файлам (а не классам) в Jar считается угрозой безопасности.

Можете ли вы обеспечить, чтобы ваша среда в стеклянной рыбке позволяла обращаться к этим файлам? Сама Java подключена таким образом, поэтому нередко встречаются обходные пути, предлагаемые для Java Advanced Imaging (где новые форматы изображений регистрируются с использованием этого механизма).

1

У меня была эта проблема с моими испытаниями JUnit с использованием GeoTools. Оказалось, что мне нужно включить зависимости для: vecmath и jsr-275.

+0

Подтвердите, что это работает для меня, когда вы используете геоинструменты в скрипте свиньи и сталкиваетесь с той же ошибкой – piggybox

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

  • Нет связанных вопросов^_^