【问题标题】:Could not find or load main class onjava找不到或加载主类 onjava
【发布时间】:2015-03-11 15:59:03
【问题描述】:

我有以下代码,我正在尝试创建与数据库的连接。 运行以下命令时出现错误“无法找到或加载 java 上的主类”:java -cp。关于java

我能够运行 javac -classpath "C:\CATALINA_HOME\lib*" onjava.java 命令 我的 .class 和 .java 文件都在同一个目录 WEB-INF\classes\com\onjava

onjava.java

package com.onjava;
import java.sql.*;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.*;

import javax.naming.Context;

public class onjava extends HttpServlet {

  private DataSource datasource;

  public void init(ServletConfig config) throws ServletException {
    try {
      // Look up the JNDI data source only once at init time
      Context envCtx = (Context) new InitialContext().lookup("java:comp/env");
      datasource = (DataSource) ((InitialContext) envCtx).lookup("jdbc/testdb");
    }
    catch (NamingException e) {
      e.printStackTrace();
    }
  }

  private Connection getConnection() throws SQLException {
    return datasource.getConnection();
  }

  public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException {
    Connection connection=null;
    try {
      connection = getConnection();
      //..<do JDBC work>..
      if (connection != null) {

            String message = "You are connected!";
            System.out.println(message);


        } else {
            System.out.println("Failed to make connection!");
        }
    } 
    catch (SQLException sqlException) {
      sqlException.printStackTrace();
    }
    finally {
      if (connection != null) 
        try {connection.close();} catch (SQLException e) {}
      }
    }
  }

编辑:

我更改了代码并添加了公共类。但是当我运行它时,我遇到了同样的错误!

package src;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Wrapper;
import java.util.Hashtable;
import java.util.Properties;
import java.io.*;
import javax.activation.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import oracle.jdbc.pool.OracleDataSource;

public class onjava {

    public static void main(String[] argv) throws SQLException, NamingException {

        Properties prop = new Properties();
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.naming.java.javaURLContextFactory");
        Context initialContext = new InitialContext(prop);
        if ( initialContext == null){
              System.out.print("JNDI problem. Cannot get InitialContext.");
        } else {System.out.print("NO JNDI problemb ");}

        // Get DataSource
        Context envContext = (Context)initialContext.lookup("java:/comp/env");
        DataSource ds = (DataSource)envContext.lookup("jdbc/testdb");



        System.out.println("\n -------- Oracle JDBC Connection Testing ------");

        try {



            Connection jdbcConnection = ((Statement) ds).getConnection();
            OracleDataSource ods = ((Wrapper) ds).unwrap(OracleDataSource.class);
            jdbcConnection.close();

        } catch (SQLException e) {

            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
            return;

        }

        String message = "You are connected!";
        System.out.println(message);

    }

}

【问题讨论】:

  • 这段代码中你的主类在哪里?这仅显示 onjava 类,但这不是您的主类。
  • 什么意思?我的主类与我的 .java 位于同一个文件夹中。我正在关注互联网上的一个例子,这就是他所拥有的......我知道我是新手
  • 看看Hypino的回答。您需要调用 main 方法或 main 类,这将允许您的程序连接到 DB。
  • 我想我错过了这里的主类。如何将它添加到此代码中,如果连接成功,我如何返回“已连接”?谢谢
  • 简单。回到你的编译器并创建一个主类。完成此操作后,创建 onjava 类的对象并使用它来调用连接到数据库的方法。

标签: java tomcat javac


【解决方案1】:

这样运行java时,需要显式声明主类。你的命令应该看起来更像java -cp . com.onjava.onjava。但是,我也没有看到此类中的主要方法。你需要指向main方法(即签名public static void main())。

顺便说一句,给类名以大写字母开头(Onjava)是正确的约定。

【讨论】:

  • 您好 Hypino,感谢您的帮助。它不起作用,我收到一条错误消息:无法找到或加载主类 com.onjava.onjava 我错过了什么吗?
  • 再次,您需要将com.onjava.onjava 替换为具有public static void main() 的类的package.classname。否则,Java 将不知道应该从哪里开始执行代码。
【解决方案2】:

好吧,根据您的说法,您需要将一个主类附加到您的项目中。这意味着回到你的编译器并创建 main 方法。要添加您的代码,您需要在主类中执行类似的操作,我将其称为 onjavaMain

public class onjavaMain{

//Main method is this
public static void main(String[] args)
       {
       //create variable of your onjava class
       onjava onJavaConnectToDatabase = new onjava();
       onJavaConnectToDatabase.doGet(argument1,argument2);
       }
}

现在这不是完整的答案,但这会让您了解在命令行中运行项目需要做什么。

【讨论】:

  • 太棒了!我应该为论点添加什么?
  • 我不确定,不过它需要引用 HttpServletRequest req、HttpServletResponse res 作为 onjava 类中的参数。
  • 感谢您的宝贵时间!不幸的是,这就是我卡住的地方。我想创建一个数据库连接并返回“已连接”文本。
  • 我理解你想要做什么。但是你需要那个主类来开始连接。就像我提到的那样,我的回答会让您知道该怎么做,但这不是完整的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2016-01-16
  • 2021-06-06
  • 2017-02-26
  • 2015-06-01
相关资源
最近更新 更多