2015-04-11 2 views
4

Я использую PhantomJS, чтобы сделать безгласное тестирование веб-сайта. Поскольку exe будет включен в файл jar, я решил прочитать его и записать его во временный файл, чтобы я мог нормально обращаться к нему через абсолютный путь.Выполнение PhantomJS изнутри Jar

Вот код для преобразования InputStream в String со ссылкой на новый временный файл:

public String getFilePath(InputStream inputStream, String fileName) 
     throws IOException 
{ 
    String fileContents = readFileToString(inputStream); 
    File file = createTemporaryFile(fileName); 
    String filePath = file.getAbsolutePath(); 
    writeStringToFile(fileContents, filePath); 

    return file.getAbsolutePath(); 
} 

private void writeStringToFile(String text, String filePath) 
     throws FileNotFoundException 
{ 
    PrintWriter fileWriter = new PrintWriter(filePath); 

    fileWriter.print(text); 
    fileWriter.close(); 
} 

private File createTemporaryFile(String fileName) 
{ 
    String tempoaryFileDirectory = System.getProperty("java.io.tmpdir"); 
    File temporaryFile = new File(tempoaryFileDirectory + File.separator 
      + fileName); 

    return temporaryFile; 
} 

private String readFileToString(InputStream inputStream) 
     throws UnsupportedEncodingException, IOException 
{ 
    StringBuilder inputStringBuilder = new StringBuilder(); 
    BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(inputStream, "UTF-8")); 

    String line; 
    while ((line = bufferedReader.readLine()) != null) 
    { 
     inputStringBuilder.append(line); 
     inputStringBuilder.append(System.lineSeparator()); 
    } 

    String fileContents = inputStringBuilder.toString(); 

    return fileContents; 
} 

Это работает, но когда я пытаюсь запустить PhantomJS это даст мне ExecuteException:

SERVERE: org.apache.commons.exec.ExecuteException: Execution failed (Exit value: -559038737. Caused by java.io.IOException: Cannot run program "C:\Users\%USERPROFILE%\AppData\Local\Temp\phantomjs.exe" (in directory "."): CreateProcess error=216, the version of %1 is not compatible with this Windows version. Check the system information of your computer and talk to the distributor of this software) 

Если я не пытаюсь читать PhantomJS из jar, следовательно, используя относительный путь, он отлично работает. Вопрос в том, как я могу читать и выполнять PhantomJS из файла jar или, по крайней мере, получить обходной путь при чтении и записи нового (временного) файла для работы.

+1

Почему в проекте фантомного exe в файле jar в первую очередь? –

+0

@ArtjomB. Чтобы пользователи не заботились о исполняемых файлах webdriver – BullyWiiPlaza

+0

Вы читаете файл phantomjs.exe в строку? –

ответ

3

Вы не можете выполнить запись JAR, поскольку JAR - это zip-файл, а операционные системы не поддерживают запуск исполняемых файлов из ZIP-файла. Они могли бы в принципе, но это сводилось бы к тому, чтобы «скопировать exe из почтового индекса, а затем запустить его».

exe ​​получает повреждение, потому что вы храните его в строке. Строки не являются двоичными данными, они UTF-16, поэтому вы не можете читать прямо из InputStream в String - требуется преобразование кодировки. Ваш код читает exe как UTF-8, преобразовывая его в UTF-16, а затем записывая его с помощью набора символов по умолчанию. Даже если набор символов по умолчанию является UTF-8 на вашем компьютере, это приведет к искаженным данным, поскольку exe недействителен UTF-8.

Попробуйте это для размера. Java 7 представила NIO.2, который (среди прочего) имеет множество удобных методов для обычных файловых операций. Включая ввод InputStream в файл! Я также использую API временного файла, который предотвратит конфликты, если одновременно будут запускаться несколько экземпляров вашего приложения.

public String getFilePath(InputStream inputStream, String prefix, String suffix) 
     throws IOException 
{ 
    java.nio.file.Path p = java.nio.file.Files.createTempFile(prefix, suffix); 
    p.toFile().deleteOnExit(); 
    java.nio.file.Files.copy(inputStream, p, java.nio.file.StandardCopyOption.REPLACE_EXISTING); 
    return p.toAbsolutePath().toString(); 
} 
+0

Да, «Фантом» испорчен. Теперь ваш код работает нормально! – BullyWiiPlaza

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