HIT2022春软件构造课——第一次博客发布

本文详细介绍了如何使用javac和java命令行工具进行JAVA程序的编译和运行,包括无包结构和有包结构代码的处理。同时,展示了如何通过makefile来管理包含多个源文件和测试文件的复杂项目,包括编译、运行和测试的指令。此外,还提供了错误排查的提示。
摘要由CSDN通过智能技术生成

JAVA的命令行使用

最基本的命令行工具是javacjava,使用javac进行编译,使用java进行运行,

  1. 对于没有包结构的java文件,可以用以下的方法进行操作,示例如下:
javac hello.java

即可在当前文件夹下获得hello.class的文件,执行class文件的命令如下

java -cp ./ hello

其中-cp选项指定java工具寻找后面类文件的路径。由于没有包结构,所以该文件在当前文件夹下,是./
注意,文件名不能带有·.class,因为java是按照模块寻找执行的

  1. 对于有包结构的代码文件则很特殊,示例如下,若包结构入下如所示
.
├── out
└── src
   ├── P1
   │   ├── Lp1
   │   │   ├── a.java
   │   │   └── b.java
   │   └── Lp2
   └── P2

其中b.java的内容如下,并且a.javab.java正好相反,即互相引用,输出时输出自己的文件名

package src.P1.Lp1;
import src.P1.Lp1.a;
public class b {
   public static void main(String[] args) {
       System.out.println("this is " + System.getProperty("user.dir") + " b.java");
   }
}

可以使用如下命令行进行编译:

javac -d out -cp ./ src/P1/Lp1/b.java

其中-d选项表示输出文件夹,-cp选项表示寻找import的类的起始路径,之后紧接着文件就好
可以使用如下指令进行运行

java -cp ./out src.P1.Lp1.b

这里的-cp选项表示寻找类名的起始路径

在了解了以上内容之后,就可以应付一些简单的工程了,比如说lab1的工程,结构如下

.
├── lib
│   ├── hamcrest-core-1.3.jar
│   └── junit-4.13.2.jar
├── src
│   ├── P1
│   │   ├── MagicSquare.java
│   │   ├── MagicSquare.java
│   │   └── txt
│   │       ├── 1.txt
│   │       ├── 2.txt
│   │       ├── 3.txt
│   ├── P2
│   │   ├── rules
│   │   │   ├── RulesOf6005.java
│   │   │   └── RulesOf6005Test.java
│   │   └── turtle
│   │       ├── Action.java
│   │       ├── DrawableTurtle.java
│   │       ├── LineSegment.java
│   │       ├── PenColor.java
│   │       ├── Point.java
│   │       ├── TurtleGUI.java
│   │       ├── Turtle.java
│   │       ├── TurtleSoup.java
│   │       └── TurtleSoupTest.java
│   └── P3
│       ├── FriendshipGraph.java
│       └── Person.java
└── test
   ├── P1
   │   └── MagicSquareTest.java
   └── P3
       ├── FriendshipGraphTest.java
       └── PersonTest.java

12 directories, 29 files

为了管理这个简单的工程,我决定使用makefile(主要是不会maven和gradle),makefile脚本如下:


# 使用说明:这是一个Makefile的build文件
# # 该文件有以下几条指令
# # make all            :编译所有源文件
# # make runP1          :运行P1文件夹中的MagicSquare    中的主方法,如果MagicSquare    没有
被编译则会先运行make all
# # make runP2          :运行P2文件夹中的TurtleSoup     中的主方法,如果TurtleSoup     没有
被编译则会先运行make all
# # make runP3          :运行P3文件夹中的FriendshipGraph中的主方法,如果FriendshipGraph没有
被编译则会先运行make all
# # make runP1test      :运行test文件夹中的MagicSquareTest的测试
# # make runP2test      :运行P2中的TurtleSoupTest的测试
# # make runP3test      :运行test文件夹中的FriendshipGraphTest的测试
# # make clean          :清除所有编译出的class文件

# 错误说明:如果使用以上指令出现错误,请看这边
# #     可能原因:版本号为11的java和javac指令没有添加您的电脑的环境变量。
# #     				  如果这样,不用添加环境变量请尝试修改以下两条配置即可
# #            例如:您的java在/usr/bin/java路径下,您的javac在/usr/lib/jvm
/openjdk-11/javac
# #                             请将以下两条修改为
# #                             JAVA:=/usr/bin/java
# #                             JAVAC := /usr/lib/jvm/openjdk-11/javac
# #                             如果还是编译错误,请助教老师及时联系我,告知错误信息,我将迅
速改正
##=================================================================================
JAVA     := java
JAVAC    := javac
##=================================================================================
SRCFILE  := $(shell find src  -name *.java | sed 's/.*\///' | cat | xargs)
TESTFILE := $(shell find test -name *.java | sed 's/.*\///' | cat | xargs)
SRCPATH  := src
OBJFILE  := $(SRCFILE:.java=.class) $(TESTFILE:.java=.class)
CLASSPA  := lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar
TEST     := org.junit.runner.JUnitCore
CLASSOUT := out/classes
OUT      := out

CLASSFILEPATH = $(shell find out -type d -wholename */\* | xargs | sed 's/ /:/g')
JAVAFILEPATH  = $(shell find src -type d -wholename */\* | xargs | sed 's/ /:/g')
TESTFILEPATH  = $(shell find test -type d -wholename */\* | xargs | sed 's/ /:/g')

VPATH = $(JAVAFILEPATH):$(CLASSFILEPATH):$(TESTFILEPATH)

.PHONY:all clean P1 P2 P3 P2test

all: $(OBJFILE)

P1: MagicSquare.class
       java -cp $(CLASSOUT):$(CLASSPA) P1.MagicSquare
P2: TurtleSoup.class
       java -cp $(CLASSOUT):$(CLASSPA) P2.turtle.TurtleSoup
P3:
     java -cp $(CLASSOUT):$(CLASSPA) P3.FriendshipGraph
P1test: MagicSquareTest.class
     java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P1.MagicSquareTest
P2test: TurtleSoupTest.class
   java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P2.turtle.TurtleSoupTest
P3test: FriendshipGraphTest.class
       java -cp $(CLASSOUT):$(CLASSPA) $(TEST) P3.FriendshipGraphTest
$(OBJFILE): %.class:%.java
     $(JAVAC) -cp $(CLASSPA):$(SRCPATH) -d $(CLASSOUT) $<
clean:
     rm -f -r $(OUT)/*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值