我试图打开一个坐在我的jar档案中的文件。
我使用这个Maven插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.fatec.migration.script.utils.Script</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
我构建并复制我的存档:
cp /home/stephane/dev/java/projects/fatec/Fiabilisation_Controles_XP_AS/target/fatec-script-jar-with-dependencies.jar .
现在我可以尝试运行它:
java -jar fatec-script-jar-with-dependencies.jar 1 2017-02-01 2017-02-02 all
唉,它找不到文件:
The file secure/extrapack-renew.sql could not be opened.
java.lang.NullPointerException
at com.fatec.migration.script.utils.AbstractScript.loadSqlStatement(AbstractScript.java:75)
但文件确实存在,我可以在存档中看到它:
$ jar -tvf target/fatec-script-jar-with-dependencies.jar | grep "secure/extrapack-renew.sql"
1844 Fri Feb 10 17:43:46 CET 2017 secure/extrapack-renew.sql
以下是我尝试打开文件的方法:
protected String loadSqlStatement(String scriptPath, String filename) {
String filepath = buildSqlFilePath(scriptPath, filename);
try {
return new String(Files.readAllBytes(Paths.get(getClass().getResource(filepath).toURI())));
} catch (Exception e) {
System.err.println("The file " + filepath + " could not be opened.");
e.printStackTrace();
}
return null;
}
private String buildSqlFilePath(String scriptPath, String filename) {
return scriptPath + "/" + filename;
}
scriptPath是&#34; secure&#34;文件名为&#34; extrapack-renew.sql&#34;。
我错过了什么?
答案 0 :(得分:1)
我认为您的问题是您使用getResource()
的方式:
Paths.get(getClass().getResource(filepath).toURI());
使用相对类路径(相对于当前类位置)来检索"extrapack-renew.sql"
文件。
这意味着该资源必须位于jar中的此路径中才能被检索。
如果资源不在当前类路径中,则用于检索资源的路径应以"/"
字符开头,以指定资源的绝对名称:
Paths.get(getClass().getResource("/"+filepath).toURI());
当然,如果你使用maven,extrapack-renew.sql
应该在
源项目的src/main/resources/secure
文件夹,以便"/secure/extrapack-renew.sql"
成为类路径中的资源。
答案 1 :(得分:0)
我的解决方案是让属性文件不在jar存档中,这与问题的原始标题中的问题相反。
我使用了一个属性文件,它位于项目主目录中。
$ ll
total 52K
-rw-rw-r-- 1 stephane 10 févr. 13 10:49 application.properties
-rw-r--r-- 1 stephane 6,1K févr. 10 17:22 pom.xml
我可以打开此文件并使用以下命令加载其属性:
properties.load(new FileInputStream(new File(DB_AUTOSELF_PROPERTIES_FILENAME)));
然后我可以将.jar
存档和属性文件移动到另一个目录,然后运行应用程序:
$ pwd
/home/stephane/trash
$ cp ~/dev/java/projects/AS/target/script-jar-with-dependencies.jar .
$ cp ~/dev/java/projects/AS/application.properties .
$ vi application.properties
-rw-rw-r-- 1 stephane 10 févr. 13 10:53 application.properties
java -jar script-jar-with-dependencies.jar 1 2016-12-01 2017-02-12 all
我的pom.xml
文件包含用于复制资源和创建胖jar
存档的插件:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.fatec.migration.script.utils.Script</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>