【问题标题】:(Java) Proper use of command line execution(Java) 正确使用命令行执行
【发布时间】:2014-06-13 08:30:24
【问题描述】:

我正在学习将 java 类连接到 MySQL (http://zetcode.com/db/mysqljava/) 的教程。我可以让代码在 Eclipse 中编译和运行,但是当我试图在命令行运行它时我做错了。顺便说一句,我正在使用 OSX 的终端。

我执行以下编译

cd dropbox/workspace/mysqltut/src/zetcode
javac Version.java

这成功创建了 Version.class 文件。

我的问题的简单版本是,如何从命令行运行它?下面详细介绍了我使用教程显示的行的尝试以及我为使类文件正常运行而做出的变化。

如果我尝试使用教程命令行运行它:java -cp .:lib/mysql-connector-java-5.1.30-bin.jar zetcode/Version.java,我会得到Error: Could not find or load main class zetcode.Version

所以我想,哦,我已经在 zetcode 中,所以我修改它并使用 java -cp .:lib/mysql-connector-java-5.1.30-bin.jar Version.java,这次我得到以下信息:

Exception in thread "main" java.lang.NoClassDefFoundError: Version (wrong name: zetcode/Version)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

不确定wrong name: zetcode/Version 是什么意思。我已经在zetcode了。请记住,在lib 之前,我找不到开关.: 的含义。我只是离开教程。所以我尝试将该开关更改为../,因为libzetcode 高一级(与src 处于同一级别)。我又收到了Error: Could not find or load main class Version

我显然只是在错误地处理执行语法,因为它在 IDE 中运行良好。提前致谢。

如果您需要源代码,我正在使用:

package zetcode;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Version {

    public static void main(String[] args) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        String url = "jdbc:mysql://localhost:3306/";
        String user = "root";
        String password = "";

        try {
            con = DriverManager.getConnection(url, user, password);
            st = con.createStatement();
            rs = st.executeQuery("SELECT VERSION()");

            if (rs.next()) {
                System.out.println(rs.getString(1));
            }

        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(Version.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);

        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (st != null) {
                    st.close();
                }
                if (con != null) {
                    con.close();
                }

            } catch (SQLException ex) {
                Logger lgr = Logger.getLogger(Version.class.getName());
                lgr.log(Level.WARNING, ex.getMessage(), ex);
            }
        }
    }
}

【问题讨论】:

  • 我认为您需要将当前目录添加到类路径中。试试:lib/mysql-connector-java-5.1.30-bin.jar;.

标签: java mysql macos terminal


【解决方案1】:

当你在编译你的类后从命令提示符运行时使用这个

java -classpath .;mysql-connector-java-5.0.8-bin.jar Version

将 jar 和 java 文件保存在同一目录中并尝试。采用 ”;”而不是上面提到的“:”。包括包名(如果有)。我已经测试过它的工作。

【讨论】:

  • .java 是一个错字。我一开始并没有使用它。我将编辑 OP。我仍然收到以下信息:
  • Stuart Kuredjian 我已经编辑了答案,试着告诉我。
  • 我现在要测试。同时你能解释一下“.:”和“.;”是什么意思吗?开关是用来做什么的?我知道“../”和“/../”,但我在其他人身上找不到任何东西。谢谢。
  • Pravi 仍然无法正常工作我将 mysql-connector-java-5.1.30-bin 移动到 ~/dropbox/workspace/mysqltut/src/zetcode, which also contains Version.class` 和 Version.Java 并运行 java -classpath .;mysql-connector-java-5.1.3-bin.jar Version 并收到java [-options] class [args...] 的使用列表,底部显示 -bash: mysql-connector-java-5.1.30-bin.jar: command not found
【解决方案2】:

您不应该从 src 目录编译源代码。编译 应该从项目目录中完成。项目目录包含 bin、src 和 lib 目录。

Linux tree 命令以树状格式列出我们的项目目录。

$ tree
.
├── bin
│   └── zetcode
│       └── Version.class
├── lib
│   └── mysql-connector-java-5.1.31-bin.jar
└── src
    └── zetcode
        └── Version.java

二进制文件进入 bin 目录,库进入 lib,源代码进入 src 目录。请注意,目录必须与包名称匹配。

要编译源代码,我们使用以下命令:

$ javac -d bin src/zetcode/Version.java

使用-d 选项,我们为创建的类文件设置目录。

以下命令执行程序:

$ java -cp bin:lib/mysql-connector-java-5.1.31-bin.jar zetcode.Version 
5.5.37-0ubuntu0.14.04.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2023-03-06
    • 1970-01-01
    • 2020-05-27
    • 2021-12-04
    • 2014-12-27
    相关资源
    最近更新 更多