Java的ClassPath, Package和Jar(zz)

java面向对象:定义一个丈夫Husband类,有姓名、年龄、妻子属性定义一个妻子Wife类,有姓名、年龄、丈夫属性丈夫类中有一个getInfo方法,其中,能显示自己的姓名,年龄,和他的妻子的姓名 题目:定义一个丈夫Husband类,有姓名、年龄、妻子属性 定义一个妻子Wife类,有姓名、年龄、丈夫属性 丈夫类中有一个getInfo方法,其中,能显示自己的姓名,年龄,和他的妻子的姓名,年龄 妻子类中有一个getInfo方法,其中,能显示自己的姓名,年龄,和她的丈夫的姓名,年龄 定义一个测试类,创建妻子和丈夫对象,然后测试...... 阅读详情

转自:http://hi.baidu.com/sunshibing/blog/item/f7b4994595a9ab3f879473bc.html

前言:


    由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所
以就直接写了一篇, 还请大家见谅.


正文:

一, 类路径 (class path)

    当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译, 
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find 
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: main. 
为什么呢? 编译好的 class 明明在呀. 
    我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java
虚拟机来解释运行的, 也就是通过 java 命令, javac 编译生成的 .class
文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader
来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从
哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).
或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行
的时候传参数给虚拟机. 这也就是指明 classpath 的三个方法. 编译的过程和运行
的过程大同小异, 只是一个是找出来编译, 另一个是找出来装载. 
    实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe) 
这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
    1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类.
    2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的 .jar 档案包.
    3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在
命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我
们在上面所说的用户自己的类就是特指这些类.
    这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.
    那么到底该怎么做呢? 用户类路径就是一些包含类文件的目录, .jar, .zip 文件的
列表, 至于类具体怎么找, 因为牵扯到 package 的问题, 下面将会说到, 暂时可认为
只要包含了这个类就算找到了这个类. 根据平台的不同分隔符略有不同, 类 unix 的系
统基本上都是 ":", windows 多是 ";". 其可能的来源是:

    * ".", 即当前目录, 这个是缺省值.
    * CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖.
    * 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.
    * 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指
定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package, 还有
特定的配置文件, 本文的最后会提到. 可先看看 jdk 自带的一些例子.

    我们举个 HelloWorld 的例子来说明. 先做以下假设: 
    * 当前目录是 /HelloWorld (或 c:\HelloWorld, 以后都使用前一个)
    * jdk 版本为 1.2.2 (linux 下的)
    * PATH 环境变量设置正确. (这样可以在任何目录下都可以使用工具)
    * 文件是 HelloWorld.java, 内容是:

    public class HelloWorld
    {
        public static void main(String[] args)
        {
            System.out.println("Hello World!\n");
            System.exit(0);
        }
    }

    首先这个文件一定要写对, 如果对 c 熟悉的话, 很有可能写成这样:

    public static void main(int argc, String[] argv)
    {
        ....
    }

    这样是不对的, 不信可以试一试. 由于手头没有 java 的规范, 所以
作如下猜想: java 的 application 程序, 必须以 public static void main(String[])
开始, 其他不一样的都不行.

    到现在为止, 我们设置方面只设置了 PATH.

    1, 当前路径就是指你的 .class 文件在当前目录下, 

       [HelloWorld]$ javac HelloWorld.java  //这一步不会有多大问题,
       [HelloWorld]$ java HelloWorld        // 这一步可能就会有问题.

    如果出了象开头那样的问题, 首先确定不是由于敲错命令而出错. 如果没有敲错命令,
那么接着做:

       [HelloWorld]$ echo $CLASSPATH   
       或者
       c:\HelloWorld>echo %CLASSPATH%

    看看 CLASSPATH 环境变量是否设置了, 如果设置了, 那么用以下命令:

       [HelloWorld]$ CLASSPATH= 
       或者
       c:\HelloWorld> set CLASSPATH=

    来使它为空, 然后重新运行. 这次用户类路径缺省的是 ".", 所以应该不会有相
同的问题了. 还有一个方法就是把 "." 加入到 CLASSPATH 中.

       [/]$ CLASSPATH=$CLASSPATH:.
       或者
       c:\HelloWorld> set CLASSPATH=%CLASSPATH%;.

    同样也可以成功. Good Luck.

    2, 当你的程序需要第三方的类库支持, 而且比较常用, 就可以采用此种方法.比如常
用的数据库驱动程序, 写 servlet 需要的 servlet 包等等. 设置方法就是在环境变量中
加入 CLASSPATH. 然后就可以直接编译运行了. 还是以 HelloWorld 为例, 比如你想在根
目录中运行它, 那么你直接在根目录下执行 
      
      $ java HelloWorld
      或者
      c:\>java HelloWorld
       
    这样肯定会出错, 如果你的 CLASSPATH 没有改动的话. 我想大家应该知道为什么错了
吧, 那么怎么改呢? 前面说过, 用户类路径就是一些包含你所需要的类的目录, .jar 档案
包, .zip 包. 现在没有生成包, 所以只好把 HelloWorld.class 所在的目录加到 CLASSPATH
了, 根据前面的做法, 再运行一次, 看看, 呵呵, 成功了, 换个路径, 又成功了!! 不仅仅可
以直接运行其中的类, 当你要 import 其中的某些类时, 同样处理.
    不知道你想到没有, 随着你的系统的不断的扩充, (当然了, 都是一些需要 java 的东西)
如果都加到这个环境变量里, 那这个变量会越来越臃肿, 虽然环境变量空间可以开很大, 总
觉得有些不舒服. 看看下面一个方法.
    
    3, 在命令行参数中指明 classpath.

    还是和上面相同的目标, 在任何目录下执行 HelloWorld, 用这个方法怎么实现呢?

      [/]$ java -cp /HelloWorld HelloWorld
      或者
      c:\>java -cp c:\HelloWorld HelloWorld

    就可以了. 这是这种方法的最简单的应用了. 当你使用了另外的包的时候, 还可以采用这
种方法. 例如:

      $ javac -classpath aPath/aPackage.jar:. myJava.java
      $ java  -cp aPath/aPackage.jar:. myJava
      或者
      c:\> javac -classpath aPath\aPackage.jar;. myJava.java
      c:\> java  -cp aPath\aPackage.jar;. myJava

    这种方法也有一个不方便的的地方就是当第三方包所在的路径较长或者需要两个以上包的
时候, 每次编译运行都要写很长, 非常不方便, 这时候可以写脚本来解决. 比如一个例子:

      compile   (文件, 权限改为可执行, 当前目录)

      $ cat compile
---------------------------
      #!/bin/bash

      javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava.java
---------------------------
      
      run (文件, 权限改为可执行, 当前目录)

      $cat run
---------------------------
      #!/bin/bash

      java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava
---------------------------

      或者:

      compile.bat

      c:\HelloWorld> type compile.bat
-------------------------      
      javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava.java
-------------------------
      
      run.bat

      c:\HelloWorld> type run.bat
------------------------
      java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava
------------------------
    就可以了. 试试看. 
    前面提到了扩展类, 扩展类是什么呢? java 的扩展类就是应用程序开发者用来
扩展核心平台功能的 java 类的包(或者是 native code). 虚拟机能像使用系统类一
样使用这些扩展类. 有人建议可以把包放入扩展目录里, 这样, CLASSPATH 也不用设了, 
也不用指定了, 岂不是很方便? 确实可以正确运行, 但是个人认为这样不好, 不能什么
东西都往里搁, 一些标准的扩展包可以, 比如, JavaServlet, Java3D 等等. 可以提个
建议, 加一个环境变量, 比如叫 JARPATH, 指定一个目录, 专门存放用户的 jar zip
等包, 这个要等 SUN 公司来做了. 


    windows98 下, 我原来安装的时候, 一直装不上, 总是死机, 好不容易装上了, 缺
省的是不能运行正确的, 然后把 tool.jar 放入 CLASSPATH 后工作正常. 现在作测试,
去掉仍然是正确的. 经过多次测试, 发现如果原来曾装过 jdk 的都很好, 没有装过的
装的时候会死机, 多装几次就可以了. 如果你发现正确安装后, 不能正常工作, 就把
tools.jar 加入 CLASSPATH, 试一下.


二, 包 (package)

    Java 中的 "包" 是一个比较重要的概念, package 是这样定义的:

Definition: A package is a collection of related classes and interfaces 
that provides access protection and namespace management.

    也就是: 一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合.
    使用包的目的就是使类容易查找使用, 防止命名冲突, 以及控制访问.
    这里我们不讨论关于包的过多的东西, 只讨论和编译, 运行, 类路径相关的东西.
至于包的其他内容, 请自己查阅相关文档.

    简单一点来说, 包就是一个目录, 下面的子包就是子目录, 这个包里的类就是
这个目录下的文件. 我们用一个例子来说明.
    首先建目录结构如下: PackageTest/source/, 以后根目录指的是 PackageTest 
目录, 我们的源程序放在 source 目录下. 源程序如下:

PackageTest.java

package pktest;

import pktest.subpk.*;

public class PackageTest
{
    private String value;

    public PackageTest(String s)
    {
        value = s;
    }

    public void printValue()
    {
        System.out.println("Value of PackageTest is " + value);
    }

    public static void main(String[] args)
    {
        PackageTest test = new PackageTest("This is a Test Package");
        test.printValue();
        PackageSecond second = new PackageSecond("I am in PackageTest");
        second.printValue();
        PackageSub sub = new PackageSub("I am in PackageTest");
        sub.printValue();
        System.exit(0);
    }
}

PackageSecond.java

package pktest;

public class PackageSecond
{
    private String value;

    public PackageSecond(String s)
    {
        value = s;
    }
    
    public void printValue()
    {
        System.out.println("Value of PackageSecond is " + value);
    }
}

PackageSub.java

package pktest.subpk;

import pktest.*;

public class PackageSub
{
    private String value;

    public PackageSub(String s)
    {
        value = s;
    }

    public void printValue()
    {
        PackageSecond second = new PackageSecond("I am in subpackage.");
        second.printValue();
        System.out.println("Value of PackageSub is " + value);
    }

}

Main.java

import pktest.*;
import pktest.subpk.*;

public class Main()
{
    public static void main()
    {
        PackageSecond second = new PackageSecond("I am in Main");
        second.printValue();
        PackageSub sub = new PackageSub("I am in Main");
        sub.printValue();
        System.exit(0);
    }
}
  
    其中, Main.java 是包之外的一个程序, 用来测试包外的程序访问包内的类,
PackageTest.java 属于 pktest 这个包, 也是主程序. PackageSecond.java 也
属于 pktest, PackageSub 属于 pktest 下的 subpk 包, 也就是 pktest.subpk.
详细使用情况, 请参看源程序.
    好了, 先把源程序都放在 source 目录下, 使 source 成为当前目录, 然后编
译一下, 呵呵, 出错了,

Main.java:1: Package pktest not found in import.
import pktest.*;

    这里涉及到类路径中包是怎么查找的, 前面我们做了一点假设: "只要包含了
这个类就算找到了这个类", 现在就有问题了. 其实 jdk 的 工具 javac java
javadoc 都需要查找类, 看见目录, 就认为是包的名字, 对于 import 语句来说,
一个包对应一个目录. 这个例子中, import pktest.*, 我们知道类路径可以包
含一个目录, 那么就以那个目录为根, 比如有个目录 /myclass, 那么就会在查找
/myclass/pktest 目录及其下的类. 所有的都找遍, 如果没有就会报错. 由于现在
的类路径只有当前目录, 而当前目录下没有 pktest 目录, 所以就会出错. 类路径
还可以包含 .jar .zip 文件, 这些就是可以带目录的压缩包, 可以把 .jar .zip 
文件看做一个虚拟的目录, 然后就和目录一样对待了.
    好了, 应该知道怎么做了吧, 修改后的目录结构如下:

    PackageTest
    |
    |__source   Main.java
       |
       |__pktest   PackageTest.java   PackageSecond.java
          |
          |__subpk  PackageSub.java
       
    然后重新编译, 运行, 哈哈, 通过了. 我们再来运行一下 PackageTest.

    [source]$ java pktest/PackageTest

    怎么又出错了? 

Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest

    是这样的, java 所要运行的是一个类的名字, 它可不管你的类在什么地方, 就象
我们前面所讨论的一样来查找这个类, 所以它把 pktest/PackageTest 看成是一个类的
名字了, 当然会出错了, 应该这么做, 

    [source]$ java pktest.PackageTest

    大家应该明白道理吧, 我就不多说了. 注意 javac 不一样, 是可以指明源文件路径
的, javac 只编译, 不运行, 查找类也只有在源文件中碰到 import 时才会做, 与源文件
所在的包没有关系.
    似乎还又些不好的地方, 怎么生成的 .class 文件这么分散呀, 看着真别扭. 别急,
javac 有一个 -d 命令行参数, 可以指定一个目录, 把生成的 .class 文件按照包给你
好好地搁在这个目录里面.

    [source]$ mkdir classes
    [source]$ javac -d classes pktest/PackageTest.java
    [source]$ javac -d classes Main.java

    那么运行怎么运行呢? 

    [source]$ cd classes
    [classes]$ java pktest.PackageTest
    [classes]$ java Main

    就可以了. 其实 jdk 的这一套工具小巧简单, 功能强大, 不会用或者用错其
实不关工具的事, 关键是明白工具背后的一些原理和必要的知识. 集成环境是很好, 
但是它屏蔽了很多底层的知识, 不出错还好, 一旦出错, 如果没有这些必要的知识
就很难办, 只好上 bbs 问, 别人只告诉了你解决的具体方法, 下一次遇到稍微变化
一点的问题又不懂了. 所以不要拘泥于工具, java 的这一套工具组合起来使用, 中
小型工程(五六十个类), 还是应付得下来的.


三, jar 文件

    以下把 .jar .zip 都看做是 .jar 文件.

 
1,  从前面我们可以看出来 jar 文件在 java 中非常重要, 极大地方便了用户的
使用. 我们也可以做自己的 .jar 包.
    还是使用前面那个例子, Main.java 是包之外的东西, 用了 pktest 包中的类,
我们现在就是要把 pktest 做成一个 .jar 包, 很简单, 刚才我们已经把 pktest 
中的 .class 都集中起来了, 

    [classes]$ jar -cvf mypackage.jar pktest

    就会生成 mypackage.jar 文件, 测试一下, 刚才我们生成的 Main.class 就在
    classes 目录下, 所以, 从前面可以知道:

    [classes]$ java -cp mypackage.jar:. Main

    就可以运行了.

2,  如果你看过 jdk 所带的例子, 你就会知道, .jar 还可以直接运行, 

    [/demo]$ java -jar aJar.jar

    那好, 就那我们的试一试, 

    [classes]$ java -jar mypackage.jar
    Failed to load Main-Class manifest attribute from
    mypackage.jar

    看来我们的 jar 和它的 jar 还不一样, 有什么不一样呢? 拿它一个例子出来,
重新编译, 生成 .jar 文件, 比较后发现, 是 .jar 压缩包中 META-INF/MANIFEST.MF
文件不一样, 多了一行, Main-Class: xxxxx, 再看看出错信息, 原来是没有指定 
Main-Class, 看看 jar 命令, 发现有一个参数 -m, 

    -m  include manifest information from specified manifest file

    和出错信息有点关系, 看来它要读一个配制文件. 只好照猫画虎写一个了.

    [classes]$ cat myManifest
    Manifest-Version: 1.0
    Main-Class: pktest.PackageTest
    Created-By: 1.2.2 (Sun Microsystems Inc.)

    [classes]$ jar cvfm mypackage.jar myManifest pktest
    added manifest
    adding: pktest/(in = 0) (out= 0)(stored 0%)
    adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflated 40%)
    adding: pktest/subpk/(in = 0) (out= 0)(stored 0%)
    adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(deflated 38%)
    adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflated 42%)

    [classes]$ java -jar mypackage.jar
    Value of PackageTest is This is a Test Package
    Value of PackageSecond is I am in PackageTest
    Value of PackageSecond is I am in subpackage.
    Value of PackageSub is I am in PackageTest

    好了, 成功了, 这样就做好了一个可以直接执行的 .jar 文件. 大家可以自己试一试
做一个以 Main 为主程序的可执行的 jar.


小结:

    这篇文章中, 我们讨论了 java 中的 class path, package, jar 等基本但比较
重要的东西, 主要是 class path. 并不是简单的一份 CLASSPATH 的完全功略, 而是
试图让读者明白其原理, 自己思考, 自己动手. 其实大多数东西都在 sun 的 java doc 
中都有, 我只不过结合例子稍微谈了一下, 希望能有所帮助. 由于条件所限, 只测试了 
jdk1.2.2 在 98 及 linux 的情况, 其他版本的 jdk 和平台请大家自己测试, 错误在
所难免, 还请指正. 

    下面是一些需要注意的问题:

1, 如果类路径中需要用到 .jar 文件, 必须把 jar 文件的文件名放入类路径, 而不是
其所在的目录.
2, 在任何时候, 类名必须带有完全的包名, 
3, "." 当前目录最好在你的类路径中.

    下面是一些常见的编译和运行的模式.

4. To compile HelloWorld.java app in the default package in C:\MyDir, use
        CD \MyDir
            C:\jdk1.3\bin\Javac.exe -classpath . HelloWorld.java
5. To run a HelloWorld.class app, in the default package in C:\MyDir, use
        CD \MyDir
            C:\jdk1.3\bin\Java.exe -classpath . HelloWorld
6. To run a HelloWorld.class app, in the default package in a jar in C:\MyDir, use
        CD \MyDir
            C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar HelloWorld
7. To compile a HelloWorld.java app in C:\MyPackage, in package MyPackage, use
        CD \
            C:\jdk1.3\bin\Javac.exe -classpath . MyPackage\HelloWorld.java
8. To run a HelloWorld.class app in C:\MyPackage, in package MyPackage, use
        CD \
            C:\jdk1.3\bin\Java.exe -classpath . MyPackage.HelloWorld
9. To run a HelloWorld.class app in C:\MyPackage, in a jar in package MyPackage, use
        CD \MyDir
            C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar MyPackage.HelloWorld

(注: default package 指的是在程序中不指定任何包).

    最后一个小小的建议, 把 sun 的 jdk tools documentation 好好地看一看, 
把 jdk 的那些工具 java javac javadoc jar javap jdb......好好用一用, 会
有好处的. The Simplest Is The Best.


参考文献:

Java Tools Documentation.
Java Glossary http://mindprod.com/
嵌入式SPI总线抽象设计:跨平台驱动与分层解耦实践 SPI(串行外设接口)是嵌入式系统中应用最广泛的同步串行通信协议,其核心价值在于高吞吐、低开销与硬件简洁性。其工作原理基于主从架构、全双工/半双工时序及片选(CS)控制,依赖CPOL/CPHA组合定义四种标准模式。在工程实践中,SPI常面临硬件资源受限、多外设共用总线、MCU平台迁移等挑战,导致驱动复用率低、维护成本高。通过结构体+函数指针实现的分层抽象——将物理总线、协议适配与设备驱动解耦,可显著提升代码可移植性与扩展性。该方法天然支持硬件SPI与GPIO模拟SPI双模式切换,并已在STM32等主流MCU 阅读详情

相关推荐

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

java jar 打包命令

许久不用jar打包,现在连打包的命令都忘了…… 重新用google搜索了一下: 打包根目录下面的文件: Java代码 jar cvf filename.jar a.class b.class   jar cvf filename.jar a.class b.class ----------------------------------------------...

lishumingwm163com的博客 367

Akamai移动端Sensor数据采集与BMP风控机制深度解析

本文深度解析了Akamai在移动端风控中的核心机制,重点阐述了Sensor数据如何通过采集陀螺仪、加速度计等硬件信息,结合设备指纹生成连续且符合物理规律的行为轨迹。详细剖析了数据从采集、加密校验到通过BMP风控三重验证(校验位、时间差、数据逻辑)的完整流程,并提供了从模拟优化到自建风控模型的实用应对思路。

quiet的专栏 284

Java 的 Class Path 和 Package(转载)

发信人: SuperMMX (笑天子), 信区: Java标  题: [整理] Java 的 Class Path 和 Package发信站: BBS 水木清华站 (Mon Apr  9 08:15:01 2001)           Java 中的 ClassPath 和 Package前言:    由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所以就直接写了一篇, 还请大家

zebra007的专栏 1727

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4611

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4587

Java NIO (二) 通道(Channels)

Channelschannels与buffers配合去实现高性能的I/O操作。本章向你介绍NIO的channel类型。

mark_cheng的专栏 3363

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

计算Java对象内存大小

摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容。 背景 目前我们系统的业务代...

u011250186的博客 2744

【OpenClaw从入门到精通】第24篇:OpenClaw Skill商业化实战指南——从0开发付费技能,在ClawHub变现(2026实测版)

本文聚焦OpenClaw Skill商业化的全流程落地,基于2026年生态现状、公开行业报告及开发者指南,拆解付费Skill的市场机会、商业模式、技术实现、发布运营及避坑要点。核心围绕“Freemium API Backend”主流路径,通过虚拟但贴合真实场景的“金融研报复现”案例,提供从需求分析、定价设计到代码开发、ClawHub上架的完整实操方案。文中包含可直接复用的代码片段、执行结果演示及流程图解,既满足新手快速入门的需求,也为进阶开发者提供商业化落地的关键思路,帮助读者抓住AI Agent早期红利。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1083

java读取classpath/package/jar下面任意文件

java读取classpath/package/jar下面任意文件。

曾昌的博客 2844

fast-lio系列改进版本

2.回环检测的优化结果,更新到FAST-LIO2的当前帧位姿中,幷进行ikdtree的重构,进而更新submap。其它的效果还不清楚,实测lio部分稳定性很好。用fast-lio_slam就很稳定。融合了fast-lio2和sc-pgo,两部分分开运行,SC-PGO从FAST-LIO2节点获取里程计和激光雷达点云主题。的作者kim在FAST-LIO2的基础上,添加SC-PGO模块,通过加入ScanContext全局描述子,进行回环修正,SC-PGO模块与FAST-LIO2解耦,非常方便,很优秀的工作。

z1872385的博客 3189

java classpath import package 机制 @Java的ClassPath, Package和Jar

java classpath import package 机制   從一個簡單的例子談談package與import機制基本原則:為什麼需要將Java文件和類文件切實安置到其所歸屬之Package所對應的相對路徑下。為什麼要這樣做呢?如果你在程序中,用到打包命令package,並且直接編譯和執行該程序。例如:以下面程序為例:package a.b.c;public class h...

weixin_34257076的博客 186

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAVA中CLASSPATH配置以及package和jar包的使用(如何import)

学习使用过程中,jdk1.5版本以上时,classpath非必须配置,但使用package包时,若不是在同一目录,则会提示找不到类,现总结一些如下: 测试代码://创建一个包 package com.baidu; public class hello{ public void print(){ System.out.println("Hello World"); } }使用命令 javac

chem2cs的博客 1021

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA学习13.package,import,jar,classpath,java中的权限

1.package 1.1 所有的Java类都是放置在同一个目录下面的,因此类之间的相互调用无需显式声明调用。 1.2 Java支持多个目录放置Java,并且通过package/import/classpath/jar等机制配合使用,可以支持跨目录放置和调用Java类。 2.import 2.1 可以用 来引入一个目录下的所有类,仅该目录下一级的类 2.2 import 尽量精确,不推荐用...

qq_41359808的博客 291

使用java -jar命令运行jar包提示“错误:找不到或无法加载主类“的问题分析

二、java执行class文件对package的路径是强依赖的。依然有问题,为什么,其实大家再回去看看java的书籍就会发现,一个类的全名应该是包名+类名。D:\HelloWorld\src\org\will\app\main\org\will\app\main\NewsManager,大家看到了吧,路径重复了。我们的工程路径是D:\HelloWorld,在HelloWorld文件夹中建立一个src文件夹,类B的源代码文件就放在src中。类A中package的路径是org.will.app.main。

qq_59125846的博客 1万+

Java 的package 機制 王森

Java 的package 機制,是每一位學習Java 的人都必須突破的門檻,所以接下來我們將就這個議題做深入討論,底下假設您剛裝好Java 2 SDK 於d:/jdk1.3.0_01 目錄之中,而且沒有修改任何的環境變數(請使用指令:echo%CLASSPATH%,看看CLASSPATH 這個環境變數是否已經設定,如果該環境變數已經被設定了,那麼您的測試結果將會和底下的測試結果有所不同)。接著我

hooray_chn的专栏 674

java中类路径classpath和包详解

类路径(classpath) java编译器编译.java文件和java虚拟机执行.class文件时的路径和写法不一样。 在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件。例如: javac d:\myjava\HelloWorld.java 编译后,在.java同路径目录下生成class文件。 默认java虚拟机要从classpath...

Honins的博客 6962

Java 的package 機制

Java 的package 機制,是每一位學習Java 的人都必須突破的門檻,所以接下來我們將就這個議題做深入討論,底下假設您剛裝好Java 2 SDK 於d:/jdk1.3.0_01 目錄之中,而且沒有修改任何的環境變數(請使用指令:echo%CLASSPATH%,看看CLASSPATH 這個環境變數是否已經設定,如果該環境變數已經被設定了,那麼您的測試結果將會和底下的測試結果有所不同)。接著我

starsinsky's JAVABLOG 1028

初学者 学好JAVA最关键几点

第一个是path 和 CLASSPATH的问题第二个是package和import问题第三个是public,protected,private,static,什 么时候用,为什么要用,怎么用第四个是制作jar文件 第一个,path 和 CLASSPATH的问题什么是path 是你的JDK的工作路径例如 你的jdk安装在C:/jdk/ 此时的你的path(如果原来没有PA

J_2004的专栏 1375

java中classpath_java中的classpath

classpath在java中是一个绕不过去的坎,我之前的文章中讲过classpath是什么。1:未打包前classpath就是项目结构中的src文件夹。2:经过maven打包以后你会在idea中看见一份target文件夹,这里边的classes就是classpath。3:当你真正运行jar包的时候,如果你要获取jar内的资源,最好使用class.getResource去最为锚点进行定位。4:当你...

weixin_35828338的博客 5367

什么是java的path和classpath?

1.什么是java的path和classpath? Java 中的 ClassPath 和 Package 前言: 由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所 以就直接写了一篇, 还请大家见谅. 正文: 一, 类路径 (

1731

Java 中的 ClassPath 和 Package

Java 中的 ClassPath 和 Package关键词: Java    中的    ClassPath    Package                                                     Java 中的 ClassPath 和 Package前言:    由于这两个问题新手问得较

901

夯实Java基础系列5:Java文件和Java包结构

本文主要介绍了抽象类和接口的特性和使用方法。 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/04/24/javase5 1 抽象类一般会实现一部分操作,并且留一些抽象方法让子类自己实现,比如Stringbuffer和Stringbuilder的父类...

Java技术江湖 5915

Java 的 Class Path 和 Package

一、 类路径 (class path)当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError : maain.为什么呢? 编译好的 class 明明在呀.我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 ja

zhaohuodian的博客 350
上一篇: Java基础—异常处理总结
下一篇: Git和Github的使用
devilkin64
博客等级 码龄19年 16粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值