java classpath问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java classpath问题相关的知识,希望对你有一定的参考价值。

我把环境变量里的classpath变量删除后 并且也没用set设置 javac 里的classpath参数也没设置 而用javac编译含有 System.out.println()方法的类却能编译通过 而且运行正常 请问没有classpath地址 javac程序是如何知道java.lang包里的System类的呢 ?
隐藏了么?那有什么必要隐藏呢?而且隐藏怎么能实现的?
比如我把classpath地址设置为我开发的classes文件夹 比如C:\app\classes
那么javac是怎么找到位于java安装文件夹里的System类的呢
javac程序没有遵循java编程规则么?

你没有理解到classpath的真正含义,这个变量的含义是在classpath所指定的目录下面去寻找class文件,注意是寻找后缀为class的文件。比如,你在E盘编写了一个java程序,保存为a.java,这时你在cmd中输入java a这样就生成了一个a.class的文件,然后你把这个文件剪切到D盘去,如果这时你在cmd中输入javac a.class那么肯定会出现找不到a.class文件的错误。但如果你在环境变量中的classpath变量后面增加了D:\这么一句的话,这个语句就能执行。你可以看到classpath的真正作用,只是搜索class文件所在的位置而已。

因此classpath与你说的java.lang包是没有任何关系的。如果你要使用java自带包中的内容,只要在程序中使用import语句把相应的包包含进来就可以了。而java.lang包在java中是默认使用import语句包含进来了的,因此即使程序中没有import java.lang.*;的语句,但java还是包含进来了的。因此你在程序中可以使用System类进行输出,这与classpath毫无关系。
参考技术A JAVAC writen in C

javac的职责就是把 .java文件转化为字节码文件.class,当然有一定的转化语法

JAVA writen in C too

java 通过C语言 来创建一个JVM,创建完成后。由JVM来装载一些classpath包 和其他东东。我怀疑,System是在这个时候装载进去的、
参考技术B classpath的含义:
在指定的目录下寻找自编或第三方包的class文件.
java classpath默认设置为"."(当前目录)
参考技术C 一切都很正常。。。lz可以看看网上有关环境变量的文章。本回答被提问者采纳

sbt 运行时 classPath 与编译 classPath 不匹配,导致 java.lang.NoClassDefFoundError

【中文标题】sbt 运行时 classPath 与编译 classPath 不匹配,导致 java.lang.NoClassDefFoundError【英文标题】:sbt runtime classPath does not match compile classPath, causes java.lang.NoClassDefFoundError 【发布时间】:2016-02-10 17:31:15 【问题描述】:

根据“show runtime:fullClasspath”的运行时类路径仅包含 target/scala-2.11/classes 和 ~/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.7。罐。 compile:fullClasspath 包含 ~/.ivy2/cache 下的所有 libraryDependencies jar 位置。为什么是这样?我在 sbt 运行时收到 java.lang.NoClassDefFoundError。

build.sbt:

name := "my-server"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= List(
  "com.typesafe.slick" %% "slick" % "3.1.0" % "provided",
  "com.twitter.finatra" %% "finatra-http" % "2.1.0" % "provided",
  "com.roundeights" %% "hasher" % "1.2.0" % "provided",
  "com.twitter" %% "util-logging" % "6.29.0" % "provided"
)

resolvers +=
  "Twitter" at "http://maven.twttr.com"

resolvers ++= Seq("RoundEights" at "http://maven.spikemark.net/roundeights")

sbt 运行结果:

Exception in thread "main" java.lang.NoClassDefFoundError: com/twitter/logging/Logger

sbt 版本 0.13.8

【问题讨论】:

【参考方案1】:

删除“提供”是这里的修复 - 我错误地使用它来解决依赖项的模棱两可的颠覆(归功于 freenode #scala 的 pfn)

【讨论】:

以上是关于java classpath问题的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么获取classpath列表

关于java中的classpath

java中classpath如何配置?

java classpath 如何设置

SpringBoot中classpath和classpath*

配置classpath路径