java命令行构建(一)

我们平时编写和编译java代码都是用ide,或用构建工具,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文件夹
├─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
  • 这个错误是没有指定main类,所以类似这样来指定:
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包 这里直接下 log4j
* 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的配置文件,所以提示上面的问题,往 build 里面加上 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操作,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值