8

現在、maven と sqlite4java を使用してプロジェクトをビルドしようとしています。これは、公式の Maven リポジトリで入手できます。Google コードの公式sqlite4java ページには設定例がありますが、少し時代遅れで、私のニーズには合いません。最後に、他の場所に展開できる単一の .jar-File が必要です。ここでの問題は、共有オブジェクトの依存関係です。私は彼らのページから公式のビルド目標を使用してそれをbuild.dir/libにコピーしていますが、私のアセンブリ目標は次のようにクラッシュします:

[INFO] Failed to create assembly: Error adding file-set for 'com.almworks.sqlite4java:libsqlite4java-linux-i386:so:0.282' to archive: Error adding archived file-set. PlexusIoResourceCollection not found for: /home/lhw/.m2/repository/com/almworks/sqlite4java/libsqlite4java-linux-i386/0.282/libsqlite4java-linux-i386-0.282.so
No such archiver: 'so'.

私は何を間違っていますか? これは、このトピックに関係のないいくつかの依存関係を取り除いた現在の pom.xml です。

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.ring0.lhw</groupId>
  <artifactId>system</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>com.almworks.sqlite4java</groupId>
      <artifactId>sqlite4java</artifactId>
      <version>${sqlite4java.version}</version>
    </dependency>
    <dependency>
      <groupId>com.almworks.sqlite4java</groupId>
      <artifactId>libsqlite4java-linux-i386</artifactId>
      <version>${sqlite4java.version}</version>
      <type>so</type>
    </dependency>
  </dependencies>
  <properties>
    <sqlite4java.version>0.282</sqlite4java.version>
  </properties>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy</id>
            <phase>compile</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>com.almworks.sqlite4java</groupId>
                  <artifactId>libsqlite4java-linux-i386</artifactId>
                  <version>${sqlite4java.version}</version>
                  <type>so</type>
                  <overWrite>true</overWrite>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.2</version>
        <configuration>
          <skipTests>true</skipTests>
          <systemProperties>
            <property>
              <name>sqlite4java.library.path</name>
              <value>${project.build.directory}/lib</value>
            </property>
          </systemProperties>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>de.ring0.lhw.Init</mainClass>
                </manifest>
              </archive>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
4

2 に答える 2

2

編集 :

jar-with-dependencies アセンブリ記述子が依存関係を解凍しようとしていると思います。

リンクを参照してください:

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

maven.apache.org/plugins/maven-assembly-plugin/… ...

<unpack>true</unpack>

そしてもちろん、.soの解凍に失敗します

そのため、やりたいことを実行するには、カスタム アセンブリを使用する必要がある場合があります。

于 2012-09-03T12:27:03.377 に答える
0

ストック「jar-with-dependencies」アセンブリ記述子を使用して、起動シェル/バッチ スクリプトを使用せずに、実行可能な jar を作成することができます。ただし、Maven 構成をあまり必要としない汚い回避策が必要です。

  1. すべてのネイティブ ライブラリ(sqlite4java zip ダウンロードに含まれる)src/main/resourcesディレクトリに配置する必要があります。また、Maven POM ファイルから sqlite4java ネイティブ ライブラリの依存関係を削除します。
  2. sqlite4java のネイティブ ライブラリ ローダーはクラスパスや JAR ファイルの内部を見ないため、起動時にネイティブ ライブラリを抽出し、実行時に "sqlite4java.library.path" システム プロパティを設定する必要があります。次のサンプル コードを参照してください。

/** List of native libraries you put in src/main/resources */
public static final String[] NATIVE_LIB_FILENAMES = {
    "libsqlite4java-linux-amd64.so",
    "libsqlite4java-linux-i386.so",
    "libsqlite4java-osx.jnilib",
    "libsqlite4java-osx-10.4.jnilib",
    "libsqlite4java-osx-ppc.jnilib",
    "sqlite4java-win32-x64.dll",
    "sqlite4java-win32-x86.dll",
};

/**
 * Extract native libraries to the current directory.
 * This example needs Apache Commons IO (https://commons.apache.org/proper/commons-io/)
 */
public static void extractNativeResources() {
    for(String filename: NATIVE_LIB_FILENAMES) {
        // Change "DemoSQLite2" to your class name
        final InputStream in = DemoSQLite2.class.getResourceAsStream("/"+filename);

        if(in != null) {
            try {
                System.out.println("Extracting " + filename);
                FileUtils.copyInputStreamToFile(in, new File(filename));
            } catch (IOException e) {
                System.err.println("Can't extract " + filename);
                e.printStackTrace();
            }
        }
    }
}

/**
 * Delete native libraries in the current directory
 */
public static void removeNativeResources() {
    for(String filename: NATIVE_LIB_FILENAMES) {
        File file = new File(filename);
        file.delete();
    }
}

public static void main(String[] args) throws Exception {
    boolean deleteNativesOnExit = false;    // Delete natives on exit

    // Extract native libraries if sqlite4java.library.path property is not set
    String sqlitePath = System.getProperty("sqlite4java.library.path");
    if(sqlitePath == null) {
        System.setProperty("sqlite4java.library.path", "."); // Read natives from current directory
        extractNativeResources();
        deleteNativesOnExit = true;
    }

    // Do SQLite jobs here
    final SQLiteConnection db = new SQLiteConnection(new File("test.db"));
    try {
        db.open();
        db.dispose();
        System.out.println("Success");
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("FAILED");
    }

    // Delete the native libraries we extracted
    if(deleteNativesOnExit) removeNativeResources();
}

これで、アプリは標準の「jar-with-dependencies」記述子でビルド可能になり、アプリは標準の「java -jar your_jar.jar」コマンドで実行できるようになります。

もちろん、今後 sqlite4java が更新された場合は、リソース ディレクトリ内のネイティブ ライブラリを手動で更新する必要があります。

汚れの少ない、より良い解決策があれば教えてください。

于 2013-09-07T06:16:35.063 に答える