为了账号安全,请及时绑定邮箱和手机立即绑定

使用其他classpath选项调用“java -jar MyFile.jar”

使用其他classpath选项调用“java -jar MyFile.jar”

慕侠2389804 2019-08-13 10:03:35
使用其他classpath选项调用“java -jar MyFile.jar”我创建了一个包含所有编译内容的jar文件。另外,我的ant构建脚本将所需的lib复制到子文件夹“libs”中。结构如下所示:MyProgram.jar libs/因此,当我尝试运行我的程序时,我收到以下错误:java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar java.lang.ClassNotFoundException: org.postgresql.Driver     at java.net.URLClassLoader$1.run(URLClassLoader.java:217)     at java.security.AccessController.doPrivileged(Native Method)     at java.net.URLClassLoader.findClass(URLClassLoader.java:205)     at java.lang.ClassLoader.loadClass(ClassLoader.java:321)     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)     at java.lang.ClassLoader.loadClass(ClassLoader.java:266)     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Class.java:186)     at database.PostgresQL.getConnection(PostgresQL.java:38)     at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19)     at main.Main.calculateCorrelationMatrix(Main.java:51)     at main.Main.main(Main.java:28)java.lang.NullPointerException     at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25)     at main.Main.calculateCorrelationMatrix(Main.java:51)     at main.Main.main(Main.java:28)为什么会这样?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您可以使用两种 -jar 或者 -cp,你不能将二者结合起来。如果要在类路径上放置其他JAR,则应将它们放在主JAR的清单中,然后使用java -jar或者将完整的类路径(包括主JAR及其依赖项)放入其中,-cp并在命令行中显式命名主类

java -cp 'MyProgram.jar:libs/*' main.Main

(我使用的dir/*语法告诉java命令将.jar特定目录中的所有文件添加到类路径中。请注意,*shell必须保护其不被扩展,这就是我使用单引号的原因。)

您提到您正在使用Ant,因此对于替代清单方法,您可以复制依赖<manifestclasspath>之后构建JAR 之前使用ant的任务。

<manifestclasspath property="myprogram.manifest.classpath" jarfile="MyProgram.jar">
  <classpath>
    <fileset dir="libs" includes="*.jar" />
  </classpath></manifestclasspath><jar destfile="MyProgram.jar" basedir="classes">
  <manifest>
    <attribute name="Main-Class" value="main.Main" />
    <attribute name="Class-Path" value="${myprogram.manifest.classpath}" />
  </manifest></jar>

有了这个,java -jar MyProgram.jar它将正常工作,并将包括libs类路径上的所有JAR文件。


查看完整回答
反对 回复 2019-08-13
?
Helenr

TA贡献1780条经验 获得超4个赞

-jar使用选项的-cp选项将被忽略。设置类路径的唯一方法是在jar中使用manifest文件。

使用该-cp选项更容易,将jar文件添加到该选项,然后显式调用主类。

此外,假设/home/user/java/MyProgram/jar/libs文件夹包含jar文件(而不是类文件),这将不起作用。您不能指定jar文件的文件夹,但必须在类路径中单独指定每个jar文件(如果有大量的jar,则值得编写一个简单的shell脚本来为您执行此操作)。


查看完整回答
反对 回复 2019-08-13
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

对于应用程序的快速一次性测试,您可以简单地将所需的依赖JAR文件符号链接到包含主应用程序JAR文件的目录中。

示例(对于app.jar使用Eclipse SWT库的应用程序,在我的情况下安装在其中/usr/share/java):

$ ln -s /usr/share/java/swt.jar .
$ java -jar app.jar


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信