Java 在maven程序集中包含共享对象
我目前正试图用maven和sqlite4java构建我的项目。可在官方maven存储库中找到。 Official确实有一个示例配置,但它有点过时,不适合我的需要。我希望最后有一个.jar文件,可以部署到其他地方。这里的问题是共享对象依赖性。我正在使用他们页面中的正式构建目标将so复制到build.dir/lib,但我的程序集目标崩溃:Java 在maven程序集中包含共享对象,java,maven,shared-libraries,Java,Maven,Shared Libraries,我目前正试图用maven和sqlite4java构建我的项目。可在官方maven存储库中找到。 Official确实有一个示例配置,但它有点过时,不适合我的需要。我希望最后有一个.jar文件,可以部署到其他地方。这里的问题是共享对象依赖性。我正在使用他们页面中的正式构建目标将so复制到build.dir/lib,但我的程序集目标崩溃: [INFO] Failed to create assembly: Error adding file-set for 'com.almworks.sqlite4
[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.0.0
德林0.lhw
系统
0.0.1-快照
com.almworks.sqlite4java
sqlite4java
${sqlite4java.version}
com.almworks.sqlite4java
libsqlite4java-linux-i386
${sqlite4java.version}
所以
0.282
org.apache.maven.plugins
maven依赖插件
复制
编译
复制
com.almworks.sqlite4java
libsqlite4java-linux-i386
${sqlite4java.version}
所以
真的
${project.build.directory}/lib
org.apache.maven.plugins
maven编译器插件
2.5.1
1.6
1.6
org.apache.maven.plugins
maven surefire插件
2.12.2
真的
sqlite4java.library.path
${project.build.directory}/lib
maven汇编插件
包裹
单一的
de.ring0.lhw.Init
带有依赖项的jar
编辑:
我认为带有依赖项程序集描述符的jar试图解压依赖项 请参阅链接: org/plugins/maven-assembly-plugin/
<unpack>true</unpack>
true
当然,它没有打开包装,所以
因此,您可能必须使用自定义程序集来执行您想要执行的操作可以使用stock“jar with dependencies”程序集描述符创建可执行jar,而无需使用任何启动shell/批处理脚本。然而,它需要不涉及太多Maven配置的肮脏变通方法
/** 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();
}
现在,您的应用程序应该可以使用标准的“jarwithdependencies”描述符构建,并且您的应用程序可以使用标准的“java-jaryour_jar.jar”命令运行
当然,如果sqlite4java将来得到更新,您必须手动更新资源目录中的本机库
如果你有更好的,不太脏的解决方案,请让我知道 -rw-rw-r--1 lhw lhw 716K Aug 30 12:23.m2/repository/com/almworks/sqlite4java/libsqlite4java-linux-i386/0.282/libsqlite4java-linux-i386-0.282。是的,文件确实存在,并在执行编译目标时复制到target/lib。您是如何将“so”安装/部署到repo的?mvn清洁安装:安装文件?您是否有此已安装依赖项的pom?如果是,您是否将依赖项的类型和打包设置为“so”?您可以尝试使用mvn clean install安装它:安装文件-dpackage=solibsqlite4java-linux-i386是共享对象依赖项,它的类型为abvoe。它会自动下载到本地存储库。如果您想亲自尝试,可以在标准maven存储库中使用sqlite4java。。。是的,所以您可能必须使用自定义程序集来执行您想要执行的操作。这是我所期望的。我希望有一种不必使用自定义程序集的方法。好吧,没办法。你能在答案中加上你的答案吗?所以我可以批准它供将来参考。如果你否决了它,请建议我一个更好的解决方案和/或你对它的看法,这样我就可以修改这篇文章。