2012-08-30 28 views
5

私は現在、mavenとsqlite4javaでプロジェクトをビルドしようとしています。これは、正式なリポジトリで利用可能です。 オフィシャルsqlite4java page on google codeには設定例がありますが、これは古くて私のニーズに合っていません。私はどこにでも展開できる単一の.jarファイルを最後に持っていたい。ここでの問題は、共有オブジェクトの貧困です。私は間違って何をやっているmavenアセンブリに共有オブジェクトを含める

[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'. 

:私はlibにbuild.dir /私のアセンブリのゴールがクラッシュするようにコピーする自分のページからの公式ビルドのゴールを使用していますか?ここではいくつかの依存関係から取り除か私の現在の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> 

答えて

1

編集:

私はジャーと依存関係のアセンブリ記述子は依存関係を展開しようとしていると思います。

リンクを参照してください:maven.apache.org/plugins/maven-assembly-plugin/...

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

...

<unpack>true</unpack> 

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

カスタムアセンブリを使用して、実行する必要がある場合があります。

+0

-rw-RW-r--の1つのLHWのLHW 716K 8月30日12時23 .m2 /リポジトリ/ COM/almworks/sqlite4java/libsqlite4java-Linuxの-I386/0.282/libsqlite4java-linux-i386-0.282.so はい、ファイルは存在し、コンパイルの目標が実行されるときにtarget/libにコピーされます。 – lhw

+0

どのようにしてリポジトリに 'so'をインストール/展開しましたか? mvnクリーンインストール:install-file? この依存関係がインストールされていますか?はいの場合、依存関係のタイプとパッケージを「そう」に設定しましたか? でインストールしようとするとmvn clean install:install-file -Dpackaging = so –

+0

libsqlite4java-linux-i386 abvoeのように共有オブジェクトの依存関係があります。自動的にローカルリポジトリにダウンロードされます。 sqlite4javaは、標準のMavenリポジトリで利用できます。 – lhw

0

"jar-with-dependencies"アセンブリ記述子を使用し、起動シェル/バッチスクリプトを使用せずに、実行可能なjarファイルを作成することは可能です。しかし、多くのMaven構成を必要としない、厄介な回避策が必要です。

  1. 我々は(included in sqlite4java zip download)へのsrc /メイン/リソースディレクトリのすべてのネイティブライブラリを配置する必要があります。また、Maven POMファイルからsqlite4javaネイティブライブラリ依存関係を削除してください。
  2. 起動でネイティブライブラリを抽出し、実行時でセット「sqlite4java.library.path」システムのプロパティにあなたが持っている、sqlite4javaのネイティブライブラリローダーがクラスパスを見てか、JARファイルの内部にはありませんので。今すぐあなたのアプリは標準の「ジャーとの依存関係」の記述子でビルド可能であるべきであり、あなたのアプリケーションは、標準の「-jar your_jar.jarのjava」と実行可能である

/** 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(); 
} 

:次のサンプルコードを参照してください。コマンド。

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

あなたがより良い、より汚れていないソリューションをお持ちの場合は、お知らせください!

+0

あなたがそれを落としたなら、よりよい解決策を提案してください、そして/または、あなたがそれについて考えているので、私はこの投稿を改訂することができます。 – NullNoname

関連する問題