如何解决从eclipse创建的可运行jar无法运行,如果运行,则使用maven构建可执行jar,为什么?
我从eclipse创建的可执行jar出现问题,也就是说,当我从命令控制台创建并运行它时,出现以下错误:
恰恰是控制台中的此错误,它不会从eclipse中启动,而只是运行应用程序而不会出错。 生成的jar中的错误(控制台错误)与位于 src / main / resources / logo.png 上的图像有关,该图像似乎找不到指定的路径。
在月食中,我用以下行加载图像:setIconImage((new ImageIcon(getClass().getClassLoader().getResource("logo.png"))).getimage());
,有趣的是,我没有收到有关 NullPointerException 的任何错误。
由于这个原因,我遵循从maven创建可执行jar的方法,执行以下操作: mvn clean compile assembly:single (创建具有依赖项的可执行jar包括在内),可以毫无问题地执行它。
我确定问题出在类路径上,因为从eclipse创建jar时:导出...> Java>可执行JAR文件,一旦创建就找不到图像。
maven文件夹结构,.classpath文件或某些错误的配置可能有问题。
无论如何,以下是完整的pom.xml
,以供参考:
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Definicion del artefacto -->
<groupId>com.silentsoft</groupId>
<artifactId>CalculadoraAO</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>CalculadoraAO</name>
<description>Calculadora basada en ImperiumAO</description>
<url>https://github.com/rusocode/CalculadoraAO</url>
<!-- Propiedades del compilador -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<licenses>
<license>
<name>GNU GPL v3.0</name>
<url>https://www.gnu.org/licenses/</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>Ru$o</id>
<name>Juan Debenedetti</name>
<email>juandebenedetti94@gmail.com</email>
<roles>
<role>owner</role>
<role>developer</role>
</roles>
</developer>
</developers>
<dependencies>
<!-- https://search.maven.org/artifact/com.miglayout/miglayout/3.7.4/jar -->
<dependency>
<groupId>com.miglayout</groupId>
<artifactId>miglayout</artifactId>
<version>3.7.4</version>
<scope>compile</scope>
</dependency>
<!-- https://search.maven.org/artifact/org.swinglabs.swingx/swingx-autocomplete/1.6.5-1/jar -->
<dependency>
<groupId>org.swinglabs.swingx</groupId>
<artifactId>swingx-autocomplete</artifactId>
<version>1.6.5-1</version>
</dependency>
</dependencies>
<!-- Configura maven-compiler-plugin para usar la misma codificacion de
caracteres en la que estan codificados los archivos fuente. -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<!-- Plugin para generar el .jar con las dependencias includidas -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.silentsoft.Launcher</mainClass> <!-- Indica la clase con el metodo main -->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes"
path="src/main/java">
<attributes>
<attribute name="optional" value="true" />
<attribute name="maven.pomderived" value="true" />
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src"
output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true" />
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes"
path="src/test/java">
<attributes>
<attribute name="test" value="true" />
<attribute name="optional" value="true" />
<attribute name="maven.pomderived" value="true" />
</attributes>
</classpathentry>
<classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true" />
</attributes>
</classpathentry>
<classpathentry kind="con"
path="org.eclipse.m2e.MAVEN2_CLAsspATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true" />
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes" />
</classpath>
这是项目的文件夹结构:
这个问题使我发疯,希望能有所帮助。谢谢!
解决方法
可能是因为您将图像打包在jar文件中。如果要在/ resource / img中说图片,您必须像这样在jar旁边放置一个资源/ img文件
app.jar
resource/img/...
旁注:jar文件是只读文件,如果您尝试对jar文件中的图像文件执行任何操作,则它将失败
,根据docs通过Class
或ClassLoader
方法返回URL
(而不是InputStream
)访问资源可能由于以下原因而失败:某些安全原因。
它还指出,如果资源实际上位于JAR中,getResource()
将始终成功。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。