小工具      在线工具  汉语词典  css  js  c++  java

java命令行构建(一)

java,java,jdk 额外说明

收录于:40天前

我们通常使用IDE来编写和编译Java代码,或者使用构建工具,ant或maven等。

但归根结底,编译代码使用的是jdk原有的命令,比如javac、java等,如果使用的工具太多,你就不再了解基本的处理,这会让你在遇到一些新的情况或者新的情况时捉襟见肘。工具。

如何使用java命令行实现ant、maven等工具的功能。

一个简单的javac编译

  • 新建两个文件夹,src和 build
    src/com/yp/test/HelloWorld.java
    build/
├─build
└─src
    └─com
        └─yp
            └─test
                    HelloWorld.java
  • java文件非常简单
package com.yp.test;
public class HelloWorld {
    

    public static void main(String[] args) {
        System.out.println("helloWorld");
    }
}
  • 编译:
javac src/com/yp/test/HelloWorld.java -d build

-d 表示编译到build文件夹

  • 查看构建文件夹
├─build
│  └─com
│      └─yp
│          └─test
│                  HelloWorld.class
│
└─src
    └─com
        └─yp
            └─test
                    HelloWorld.java
  • 运行文件
E:\codeplace\n_learn\java\javacmd> java com/yp/test/HelloWorld.class
错误: 找不到或无法加载主类 build.com.yp.test.HelloWorld.class
  • 运行时必须指定main
E:\codeplace\n_learn\java\javacmd\build> java com.yp.test.HelloWorld
helloWorld

如果编译多个类,路径如何排列?

编译

E:\codeplace\n_learn\java\javacmd>javac src/com/yp/test/HelloWorld.java -sourcepath src -d build -g

-sourcepath 表示从指定的源文件目录中查找依赖

运行,注意:在build目录下运行

E:\codeplace\n_learn\java\javacmd\build>java com.yp.test.HelloWorld

如何打成jar包呢?

  • 产生:
E:\codeplace\n_learn\java\javacmd\build>jar cvf h.jar *
  • 跑步:
E:\codeplace\n_learn\java\javacmd\build>java h.jar
错误: 找不到或无法加载主类 h.jar
  • 这个错误是没有指定主类,所以这样指定:
E:\codeplace\n_learn\java\javacmd\build>java -cp h.jar com.yp.test.HelloWorld

生成可执行jar包

需要指定jar包的应用程序入口点,使用-e选项:

E:\codeplace\n_learn\java\javacmd\build> jar cvfe h.jar com.yp.test.HelloWorld *
已添加清单
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/yp/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/yp/test/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/yp/test/entity/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/yp/test/entity/Cat.class(输入 = 545) (输出 = 319)(压缩了 41%)
正在添加: com/yp/test/HelloWorld.class(输入 = 844) (输出 = 487)(压缩了 42%)

直接运行

java -jar h.jar
  • 额外发现
    指定了Main类后,jar包里面的 META-INF/MANIFEST.MF 是这样的, 比原来多了一行Main-Class….
Manifest-Version: 1.0
Created-By: 1.8.0 (Oracle Corporation)
Main-Class: com.yp.test.HelloWorld

如果类中引用了jar包怎么办?

先下一个jar包 这里直接下 日志4j
* main函数改成

import com.yp.test.entity.Cat;
import org.apache.log4j.Logger;

public class HelloWorld {
    

    static Logger log = Logger.getLogger(HelloWorld.class);

    public static void main(String[] args) {
        Cat c = new Cat("keyboard");
        log.info("这是log4j");
        System.out.println("hello," + c.getName());
    }

}

当前文件看起来像这样

├─build
├─lib
│      log4j-1.2.17.jar
│
└─src
    └─com
        └─yp
            └─test
                │  HelloWorld.java
                │
                └─entity
                        Cat.java
  • 这时javac命令必须连接-cp ./lib/*.jar
E:\codeplace\n_learn\java\javacmd>javac -encoding "utf8" src/com/yp/test/HelloWorld.java -sourcepath src -d build -g -cp ./lib/*.jar
  • 运行,
    要加上-cp, -cp 选项貌似会把工作目录给换了, 所以要加上 ;../build
E:\codeplace\n_learn\java\javacmd\build>java -cp ../lib/log4j-1.2.17.jar;../build com.yp.test.HelloWorld

结果:

log4j:WARN No appenders could be found for logger(com.yp.test.HelloWorld).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
hello,keyboard

由于没有log4j配置文件,所以提示上述问题。将 log4j.xml 添加到构建中。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
        </layout>
    </appender>

    <root>
        <level value="info" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>

再次运行

E:\codeplace\n_learn\java\javacmd>java -cp lib/log4j-1.2.17.jar;build com.yp.tes t.HelloWorld
15:19:57,359 INFO  [HelloWorld] 这是log4j
hello,keyboard
  • 说明:
    这个log4j配置文件,习惯的做法是放在src目录下, 在编译过程中 copy到build中的,但根据ant的做法,不是用javac的,而是用来处理,我猜测javac是不能copy的,如果想在命令行直接 使用,应该是用cp命令主动去执行 copy操作,
. . .

相关推荐

额外说明

SuperDog - 一个基于netty的Web服务器开发项目

  项目GitHub地址:https://github.com/HelloWorld-Ian/SuperDog   这是我在实习期间开发的一个项目demo,简单来说是一个基于netty框架的web服务器,基本功能类似于tomcat服务器,可以实现静态资源

额外说明

SPRING02_Core注解,Bean、primary、DependsOn、Lazy、Scope、ComponentScan、详细Import、Lookup注解

文章目录 ①. Spring核心注解概览 ②. @Bean、@Primary、@DependsOn ③. @Lazy、@Scope 、@Configuration ④. @Component、@Indexed、@Order ⑤. @ComponentSc

额外说明

MAVEN01_概述+核心概念+如何在IDEA中使用(创建项目)

文章目录 ①. Maven 简介 ①. Maven概述 ②. maven的安装 ③. 原生Maven演示: ②. Maven的核心概念 ①. Maven目录结构 ②. pom.xml ③. 仓库repository ④. Maven的生命周期 ⑤. Ma

额外说明

Android实战跑腿项目——登录注册

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

问题随记 —— Python3.8 fasttext 安装

文章目录 问题描述 解决方法 问题描述 Python 安装 fasttext 解决方法 输入以下命令安装即可。 pip install fasttext 如果报错,需要事先安装 C++ 11 环境,否则将编译不成功,C++ 11 环境安装方式在下面的链

额外说明

解读基思·斯坦诺维奇《超越智商》

文章目录 关于作者 关于本书 核心观点 一、聪明人,不一定理性 二、做决定时,我们的大脑里究竟发生了什么? 三、认知吝啬鬼的三个诡计 1. 生动的就是对的 2. 别人给什么,你就要什么 3. 相信自己总是对的 四、做出理性决策的三条途径 1. 假设这件事

额外说明

Windows系统缺少tcpmib.dll文件出现系统异常问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个tcpmib.dll文件(挑

额外说明

12种最有用的WordPress自定义帖子类型教程

WordPress allows you to create your own custom content types. These content types are called 自定义帖子类型. You can use them to add c

额外说明

Docker应用容器引擎

Docker简介 Docker 是一个开源应用程序容器引擎。 Docker 允许开发人员将他们的应用程序和依赖包打包到一个轻量级、可移植的容器中,然后将其发布到任何流行的 Linux 机器上,这些机器也可以虚拟化。容器完全使用沙箱机制,相互之间没有任何接

额外说明

VMware虚拟机安装Ubuntu系统教程

使用的文件如下: VMware® 工作站 17 专业版 ubuntu-22.04.3-desktop-amd64.iso 一,你Buntu命名规则和版本列表 1.Ubuntu命名规则: 例如:ubuntu 16.04 LTS是长期维护版本; ubuntu

ads via 小工具