【问题标题】:How to compile java project with external jar file in Linux terminal如何在 Linux 终端中使用外部 jar 文件编译 java 项目
【发布时间】:2012-03-01 07:15:11
【问题描述】:

我有一个包含外部 jar 文件的项目,我点击此链接 http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-%28Java%29 添加外部 java 路径。然后我尝试在终端中编译我的代码,但是我仍然收到有关 jar 文件不存在的错误。

我写了以下命令:(目前我在项目目录下,里面有bin src和lib三个文件夹)

bash-3.2$ ls
bin  lib  README.txt  src
bash-3.2$ javac -cp lib/jsoup-1.6.1.jar src/DayTradingStockBlog.java
bash-3.2$ java -cp .:lib/jsoup-1.6.1.jar src/DayTradingStockBlog
Exception in thread "main" java.lang.NoClassDefFoundError: src/DayTradingStockBlog (wrong name: DayTradingStockBlog)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: src/DayTradingStockBlog.  Program will exit.

我应该如何解决这个问题?

【问题讨论】:

  • 这个错误究竟是什么意思?
  • 包 org.jsoup 不存在 import org.jsoup.Jsoup;
  • 我在 src 目录中使用以下代码进行编译:javac myClass.java
  • 您必须设置类路径以包含您的 jar 文件..
  • java -cp .; lib/jsoup-1.6.1.jar src/myClass - 这里用双引号/单引号括住 -cp 或 -classpath 选项后面的任何内容。后的分号。 (点)表示它是命令的结尾,并尝试执行后面的任何命令作为下一个命令。因此出现“权限被拒绝”错误。

标签: java jar terminal


【解决方案1】:

你应该把java文件和jar文件放在同一个目录下 示例:javac -cp jdbc.jar myClass.java 它对我有用

【讨论】:

  • 这没什么用,假设你有多个程序都使用同一个外部 JAR,你每次都复制 JAR 吗?
【解决方案2】:

在对 java 的调用(但对 javac)的调用中,您永远不会使用作​​为路径分隔符的斜杠。如果 src 是你的包声明的一部分——在这种情况下是整个包声明,我敢打赌它不是,你会,而不是:

 java -cp .:lib/jsoup-1.6.1.jar src/DayTradingStockBlog

使用点:

 java -cp .:lib/jsoup-1.6.1.jar src.DayTradingStockBlog

但我猜它只是你创建类的地方,所以路径属于类路径:

 java -cp .:lib/jsoup-1.6.1.jar:./src DayTradingStockBlog

您不能随意从类名中省略路径,并将其附加到类路径中,反之亦然 - 它必须适合您的包声明。

如果你声明一个包foo,(它比src更有意义),你的类名不再是DayTradingStockBlog而是foo.DayTradingStockBlog

【讨论】:

  • +1 用于正确调用“打包类”(使用点)。
【解决方案3】:

使用类路径 (-cp)

javac -cp %YOUR_JAR_LOCATION% myClass.java 

【讨论】:

  • @CanCeylan 转到 jar 目录(Linux 中没有文件夹)并提供访问权限:chmod 777 ./jsoup-1.6.1.jar 然后再次运行 javac
  • @aviad 这不是问题。您不想让它的权限变为 777,只是为了将库放在类路径中。
  • @asgs,恐怕这是一个问题“权限被拒绝”与我所知道的任何其他事情无关。它是关于使 java 类编译,而不是教权限如何在 Linux 上工作。
  • @aviad 直接在问题下方查看我的评论。
  • @CanCeylan,在 Linux 上使用“:”冒号作为类路径分隔符
【解决方案4】:

根据您的编辑,我建议您将所有类路径位置用单引号/双引号括起来。也就是说,让它像

java -cp '.:lib/jsoup-1.6.1.jar' src/myClass.

在 linux 中,类路径中的项目由冒号 (:) 分隔,而在 Windows 中,它是一个分号 (;)。

【讨论】:

  • bash-3.2$ javac -cp lib/jsoup-1.6.1.jar src/myClass.java bash-3.2$ java -cp .:lib/jsoup-1.6.1.jar src/myClass
  • 我现在尝试了这些命令,第一个正在工作,但是对于第二个它在线程“main”java.lang.NoClassDefFoundError:src/myClass(错误名称:myClass)中给出异常
  • @CanCeylan 那是因为 myClass 不在包 src 下。我猜你只是编造的。让它成为 myClass。
  • cd src; javac -cp lib/jsoup-1.6.1.jar myClass.java; java -cp '.:lib/jsoup-1.6.1.jar' myClass,以防万一你还没弄好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2011-08-18
  • 2020-02-22
  • 2015-05-21
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多