当前位置: 首页 > 知识库问答 >
问题:

使用附加的类路径选项调用“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.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)

为什么会出现这种情况?

共有1个答案

红富
2023-03-14

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

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

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

您提到您正在使用Ant,因此对于替代清单方法,您可以在复制依赖项之后但在构建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就可以正常工作,并且将包括类路径上的所有libsJAR文件。

 类似资料:
  • 问题内容: 我创建了一个包含所有已编译内容的jar文件。另外,我的ant构建脚本将所需的库复制到子文件夹“ libs”中。结构如下: 因此,当我现在尝试运行程序时,出现以下错误: 为什么会这样? 问题答案: 你可以使用两种 或者 ,你不能将二者结合起来。如果要将其他JAR放在类路径中,则应将它们放在主JAR的清单中,然后使用,或者将完整的类路径(包括主JAR及其依赖项)放入其中,并在命令行上显式命

  • 我创建了一个包含我所有编译内容的jar文件。此外,我的ant build脚本将所需的libs复制到子文件夹“libs”中。结构如下所示: 所以当我现在尝试运行我的程序时,我收到以下错误: 为什么会发生这种情况?

  • 愚蠢的问题,但我花了半个小时寻找答案 如果我试着将其设置为运行时 或 它看不到自由 如果我把它放在VM选项中,它可以工作,但我想附加%%或$work 附言:我赢了

  • 如何使用类路径加载csv文件?在此之前,我尝试使用FileReader加载文件,这在本地运行时工作正常,但是当部署到外部服务器时会引发像FileNotFound这样的异常。下面的代码在本地工作,但是当部署在tomcat文件夹www/[jar]上的jar抛出这个异常不幸的是,我无法提供原始代码。这是要点:

  • 我正在使用Java代理和Javassist向一些JDK类添加一些日志记录。实际上,当系统加载一些TLS类时,Javassist会向它们添加一些额外的字节码,以帮助我调试一些连接问题。 问题是,考虑到这个类包含在代理jar中: 在我的代理的转换方法中,假设我试图使用javassist调用该类: 你认为这行得通,但我得到了这个: 有没有办法将该类[]添加到应用程序的类路径中?

  • 首先,我不完全确定这是正确的问题。基本上,我的最终目标是生成一个可以操作一组。docx文件的程序,以便对每个文件进行小的更改。在我看来,docx4j是实现这一目标的最佳方式。但是,我从来没有使用过提供的库之外的库。我首先试图破译手册中提供的所有信息,然后告诉我需要SLF4J才能使用Docx4J。 从这一点来看,我想我做错了什么。我很确定我知道我想写的程序背后的伪逻辑,但我不确定如何写它。我还没有做