当前位置: 首页 > 面试题库 >

使用附加的classpath选项调用“ java -jar MyFile.jar”

薛淳
2023-03-14
问题内容

我创建了一个包含所有已编译内容的jar文件。另外,我的ant构建脚本将所需的库复制到子文件夹“ 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.calculateCorrelathtml" target="_blank">ionMatrix(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)

为什么会这样?


问题答案:

你可以使用两种 -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文件。



 类似资料:
  • 我创建了一个jar文件,其中包含所有编译的内容。此外,我的ant构建脚本将所需的库复制到子文件夹“libs”中。结构如下所示: 为什么会出现这种情况?

  • 问题内容: 可以将option与with一起使用,添加还是替换env变量的内容? 问题答案: 使用classpath变量,它会覆盖环境变量的CLASSPATH,但仅适用于该会话。如果重新启动应用程序,则需要再次设置classpath变量。

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 在 XML 中使用属性格式 属性格式 <RECORDS> <RECORD OrderNo="1003" ItemNo="1" PartNo="1313" Qty=

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加到输出文件 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 记录分隔符、字段分隔符、文本标识符号 指定记录的分隔符号、字段的分隔符号和用于括住文本值的字符。 日期排序、日期分隔符 指定日期的格式和日期的分隔符。

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 在 XML 中使用属性格式 属性格式 <RECORDS> <RECORD OrderNo="1003" ItemNo="1" PartNo="1313" Qty=

  • 我想在Java 14中使用附加API。据我所知,这是转移到jdk。在Java 9中附加。我运行了java--列出模块,并安装了该模块。 我如何在我的项目中实际使用该模块?我试着导入jdk。附加,但这引发了一个错误。