maven命令行下载依赖包&java命令执行class

2022-06-02 14:20:32 浏览数 (1)

01

场景和需求

在Linux系统下, 没有第三方的集成开发工具(如IDEA), 如何下载Jar包, 以及如何运行.java文件.

解决步骤 首先在你的系统上已经配置好了maven环境和Java环境.

如何配置此处就不介绍了, 属于基础操作

此处以下载netty为例

在官网 https://mvnrepository.com/ 查找需要下载的依赖包的groupId等, 比如本篇以下载4.1.63.Final版本netty为例

代码语言:javascript复制
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.63.Final</version>
</dependency>

于是, 使用mvn命令下载

代码语言:javascript复制
mvn dependency:get -DremoteRepositories=http://repo1.maven.org/maven2/ -DgroupId=io.netty -DartifactId=netty-all -Dversion=4.1.63.Final

稍等片刻, 就会下载成功.

源文件内容

代码语言:javascript复制
// Allocator.java

package com.infuq;

import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.PooledUnsafeDirectByteBuf;

public class Allocator {

    public static void main(String[] args) {

        PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
        // 申请堆外空间
        PooledUnsafeDirectByteBuf byteBuf = (PooledUnsafeDirectByteBuf) allocator.directBuffer(2048);

        // 内存地址
        long address = byteBuf.memoryAddress();
        System.out.println("Address:0x"   Long.toHexString(address));

    }
}

目录结构如下

编译Java源文件

代码语言:javascript复制
// Linux系统
javac -d . -classpath ".:./lib/*"  Allocator.java

// Windows系统
javac -d . -classpath ".;./lib/*"  Allocator.java

编译之后的目录结构

执行

代码语言:javascript复制
// Linux系统
java -classpath ".:./lib/*" com.infuq.Allocator

// Windows系统
java -classpath ".;./lib/*" com.infuq.Allocator

这里需要说明一点的是, 在使用javac和java命令的时候, 在指定-classpath, 如果是Linux系统, 那么使用:分隔目录, 如果是Windows系统, 那么使用;分隔目录.

以上就是本篇要说的主要内容, 顺便再说下, 代码本身的含义是Netty申请一个堆外空间, 并打印地址.

在Netty之线程唤醒wakeup文章中, 提到了如何追踪系统调用. 在这里也使用strace命令追踪下Netty底层调用的内存分配的系统调用是哪个.

打印的内容是Address:0x7fab46fff010

使用grep搜索这个地址0x7fab46fff010

除了正常的打印之外, 并没有看到多余的内存申请的系统调用方法

使用grep搜索0x7fab46f(减少了0x7fab46fff010最后面的5个数字), 结果如下

使用的系统调用是mmap申请内存空间.

但是mmap返回的地址是0x7fab46fff000.

而Netty返回给应用的地址是0x7fab46fff010. 相差0x10, 这并不是巧合, 是什么原因呢? 在后面讲解Netty内存分配的时候细说.

0 人点赞