4

外部 com オブジェクトを使用するには、Jacob jar と dll ライブラリを Jenkins プラグインに含める必要があります。ジェイコブを使用するjacob_excel_reader プラグインを見つけましたが、解決策は私を満足させません。開発者は、jar 依存関係をpom.xmlファイルに追加しました。

<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を統合する唯一の方法ですか? 別の方法で試してみましたが、途中で行き詰まってしまいました。ぜひあなたの助けが必要です!

最初に、jar ファイルと 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/libjar ファイルもコピーするのはなぜですか? 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

4

1 に答える 1

2

一般に、必要なことは、DLL が存在するパスを取得し、ジェイコブにパスを見つける場所のヒントを与えることです。

最初のステップに関して、これはうまくいくかもしれません:

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

または、たとえば、DLL ファイルが JAR にパックされている場合は、最初にそれを既知の場所に展開する必要があります。

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 パスを知らせるための 2 番目のステップについては、次のようにします。

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

ただし、コマンド ライン フラグよりもはるかに優れているわけではありません。ただ違う...一般的にWebApp内から、または特にJenkinsプラグイン内からDLLをロードする「簡単な」(すぐに使える)方法はないようです。

于 2013-10-15T10:15:32.453 に答える