2013-10-15 5 views
4

Чтобы использовать внешний объект com com, я должен включить библиотеку Jacob jar и dll в свой плагин Jenkins. Я нашел jacob_excel_reader plugin, которые используют Якоб, но решение меня не удовлетворяет. Разработчик добавил зависимость баночку с pom.xml файла:Использовать внешнюю библиотеку dll в плагине Jenkins

<dependency> 
    <groupId>com.jacob</groupId> 
    <artifactId>jacob</artifactId> 
    <version>1.17-M2</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/jacob.jar</systemPath> 
</dependency> 

и интегрирует DLL-файл с помощью аргумента:

-Djava.library.path=${workspace_loc:jacob_excel_reader}\lib 

Это единственный способ интегрировать DLL? Я пробовал это по-другому, но я застрял на полпути, и мне определенно нужна ваша помощь!

Сначала я добавил зависимость для фляги и длл файл в pom.xml:

<dependency> 
    <groupId>net.sf.jacob-project</groupId> 
    <artifactId>jacob</artifactId> 
    <version>1.14.3</version> 
</dependency> 
<dependency> 
    <groupId>net.sf.jacob-project</groupId> 
    <artifactId>jacob</artifactId> 
    <version>1.14.3</version> 
    <classifier>x86</classifier> 
    <type>dll</type> 
</dependency> 

и настроить, что файл DLL будет скопирован в target/APPNAME/WEB-INF/lib:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>prepare-package</phase> 
      <goals> 
      <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
      <excludeTransitive>true</excludeTransitive> 
      <includeArtifactIds>jacob</includeArtifactIds> 
      <includeTypes>dll</includeTypes> 
      <failOnMissingClassifierArtifact>true</failOnMissingClassifierArtifact> 
      <silent>false</silent> 
      <outputDirectory>target/APPNAME/WEB-INF/lib</outputDirectory> 
      <overWriteReleases>true</overWriteReleases> 
      <overWriteSnapshots>true</overWriteSnapshots> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Когда я бегу mvn package в испытания по умолчанию бросают предупреждение:

SEVERE: Failed Inspecting plugin C:\...\AppData\Local\Temp\hudson7697228528744044800tmp\the.jpl 
java.util.zip.ZipException: error in opening zip file 

, но он копирует файл dll и jar в target/APPNAME/WEB-INF/lib. Почему он копирует файл jar и что вызывает ZipException?

Во время выполнения плагина плагинов бросает:

FATAL: no jacob-1.14.3-x86 in java.library.path 
java.lang.UnsatisfiedLinkError: no jacob-1.14.3-x86 in java.library.path 

и не может найти файл DLL, почему? Могу ли я добавить target/APPNAME/WEB-INF/lib в java.library.pathбез использования приведенного выше аргумента?

ответ

2

В общем, что вам нужно сделать, это получить путь, в котором находится DLL, а затем дать Джейкобу подсказку, где найти путь.

Что касается первого шага, это может работать:

String relativeWebPath = "/WEB-INF/lib/"; 
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath); 

В качестве альтернативы, если, например, файл DLL упакован в баночку, вы должны извлечь его первым в известном месте.

InputStream in = SomeClassInTheJAR.class.getResourceAsStream("/jacob-1.17-x86.dll"); 
File fileOut = new File(tempDir + "/jacob-1.17-x86.dll"); 
String absoluteDiskPath = tempDir; 

OutputStream out = FileUtils.openOutputStream(fileOut); 
IOUtils.copy(in, out); 
in.close(); 
out.close(); 

Что касается второй шаг, чтобы сделать путь DLL известного Иакову, сделайте следующее:

System.setProperty(com.jacob.com.LibraryLoader.JACOB_DLL_PATH, absoluteDiskPath); 

Однако, это не намного лучше, чем флаг командной строки. Просто разные ... Кажется, что нет «простого» (как в готовом) способа загрузить DLL изнутри WebApp вообще или из плагина Jenkins в частности.

+0

Я использовал фрагмент кода (и изменил 'getServletContext()' на 'Jenkins.getInstance(). ServletContext'), но он выдает' FATAL: ... \ target \ work \ webapp \ WEB-INF \ lib: Может 't найти зависимые библиотеки java.lang.UnsatisfiedLinkError: ... \ target \ work \ webapp \ WEB-INF \ lib: не удается найти зависимые библиотеки –

+0

Есть ли какое-нибудь решение? –

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