杂七杂八的java笔记
reference
https://blog.csdn.net/lvshaorong/article/details/73881568 https://blog.csdn.net/yeqiuBOke/article/details/80897611 https://users.soe.ucsc.edu/~eaugusti/archive/102-winter16/misc/howToCompileAndRunFromCommandLine.html https://www.cnblogs.com/by-1075324834/p/5558035.html 菜鸟教程 think in java 第四版
脱离IDE编译java
工程目录
根目录/下
src/存放源代码classes/存放编译好的class
编译
简单地在同一path下编译:
- 单个文件:
javac file.java - 多个文件:
javac YourSourceFile.java - 该dir中所有java files:
javac *.java - 使用compiler flags:
javac -Xlint:unchecked SourceFile.java(多文件和通配符也可使用该参数)
编译单个文件:
javac -d classes src/xxx.java
-d参数后跟class文件的输出目录,如果没有-d参数会在当前目录下生成class文件,而且没有根据包名建立相应的目录
如果主类中import了工具类,需要同时编译,比如
javac -d classes src/*.java
- javac: Java compiler
-
java: Java Virtual Machine
Linux下为UTF-8编码,javac编译gbk编码的java文件时,容易出现“错误: 编码UTF8的不可映射字符”
解决方法是添加encoding 参数:javac -encoding gbk WordCount.java
运行class文件
java -classpath classes test.ant.HelloWorld
-classpath参数规定class文件的搜索范围,并指明程序主入口
不使用: -classpath
java ClassName
the file name specified must be a .class file that contains a main method
运行类时,不用加.class。
比如有一个类Hello.class,运行命令是java Hello而不是java Hello.class 。运行机制中是寻找类,而不是像编译的时候那样找到某个文件。
打包jar
cd classes
使jar包打出来之后最外层文件夹是属于包名的,不然会报错找不到类
jar -cvf xxx.jar ./*
打开这个jar,除了META-INF之外的木以要是属于包名的目录
运行jar
java -jar xxx.jar
java makefile
这是来自https://www.cnblogs.com/jiqingwu/archive/2012/06/13/java_makefile.html的一份通用makefile
# A general java project makefile
# Author: Wu Jiqing (jiqingwu@gmail.com)
# create: 2012-06-12
# update: 2012-06-13
# version: 0.7
# 设置你要生成的jar包的文件名
# Set the file name of your jar package:
JAR_PKG = a.jar
# 设置你的项目的入口点
# Set your entry point of your java app:
ENTRY_POINT = test.A
# 是否需要res目录,如果你的程序有图片、文档等,
# 最好放入res目录中。
# yes: 需要;no:不需要
RES_DIR = yes
# 设置你项目包含的源文件
# 如果你使用了package,请自己在src下建立相应的目录层次,
# 并将源文件放在对应的目录中。
# 如你要生成的一个类是 com.game.A,
# 那么你的源文件应该是 com/game/A.java。
# 多个类之间用空格间隔,如果一行太长,用'\'换行,
# 建议一行一个。
# 另外注意顺序,如果class A 引用 class B,那么B.java应该放在A.java前。
SOURCE_FILES = \
test/B.java \
test/A.java
# 设置你的java编译器
# Set your java compiler here:
JAVAC = javac
# 设置你的编译选项
JFLAGS = -encoding UTF-8
# 用法:
# make new: 在你的工程目录下生成src, bin, res子目录。
# 如果你定义的类包含在某个包里:请自己在src下建立相应的目录层次。
# 最终的目录结构如下:
# ├── a.jar
# ├── bin
# │ └── test
# │ ├── A.class
# │ └── B.class
# ├── makefile
# ├── res
# │ └── doc
# │ └── readme.txt
# └── src
# └── test
# ├── A.java
# └── B.java
# make build: 编译,在bin目录下生成 java classes。
# make clean: 清理编译结果,以便重新编译
# make rebuild: 清理编译结果,重新编译。
# make run: make 之后,可以通过make run查看运行结果。
# make jar: 生成可执行的jar包。
#############下面的内容建议不要修改####################
vpath %.class bin
vpath %.java src
# show help message by default
Default:
@echo "make new: new project, create src, bin, res dirs."
@echo "make build: build project."
@echo "make clean: clear classes generated."
@echo "make rebuild: rebuild project."
@echo "make run: run your app."
@echo "make jar: package your project into a executable jar."
build: $(SOURCE_FILES:.java=.class)
# pattern rule
# 不能处理两个类互相引用的情况,尽量避免
%.class: %.java
$(JAVAC) -cp bin -d bin $(JFLAGS) $<
rebuild: clean build
.PHONY: new clean run jar
new:
ifeq ($(RES_DIR),yes)
mkdir -pv src bin res
else
mkdir -pv src bin
endif
clean:
rm -frv bin/*
run:
java -cp bin $(ENTRY_POINT)
jar:
ifeq ($(RES_DIR),yes)
jar cvfe $(JAR_PKG) $(ENTRY_POINT) -C bin . res
else
jar cvfe $(JAR_PKG) $(ENTRY_POINT) -C bin .
endif
make new: 新建工程,在当前目录下生成src, bin, res(如果 RES_DIR = yes)子目录,类似Eclipse项目的目录层次。java源文件放 在src目录下,生成的class放在bin目录下。 make build: 编译工程。 make clean: 清除生成的class,以便重新编译。 make rebuild: 重新编译工程,相当于make clean; make build。 make run: 运行编译生成的应用。 make jar: 生成可执行的jar包。 make: 显示帮助信息。
java中的xml
- xml作为数据储存(很少)
- 存放配置信息
IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉。如果使用的是Eclipse,Eclipse的src目录下的xml等资源文件在编译的时候会自动打包进输出到classes文件夹。
java包
import和包机制
Java中的一个包就是一个类库单元,用import导入一个完整的库时,就会获得包, 例如`import java.util.*` , 包内包含有一组类,它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。
单独导入一个类,如位于java.util(utility库)中的Vector,可以在import语句中指定类的名字import java.util.Vector
包机制便于管理命名空间(name space),使类成员的名字相互隔离起来。如类A中的方法f()与类B中的方法f()不冲突。
库
一个编辑单元(.java file)有且仅有一个同名的public类,非public类在该包之外被隐藏。
编译一个java file, 里面所有的class都会得到一个.class file, 一系列的.class文件封装压缩到一起形成一个jar file.
库也由一系列类文件构成,每个类文件有一个public类,所以每个文件都有一个组件,如果将这些组件都归纳在一起,就可以使用package
package语句作为文件的第一个非注释语句。它指明该编译单元内的public类名位于该package的名字下面。
例如,对于MyClass.java
package mypackage;
public class MyClass{
//...
}
若想使用MyClass, 有两种方法
- 指定完整名称
mypackage.MyClass m = new mypackage.MyClass();
- import激活mypackage中的名字
import mypackage.*;
//...
MyClass m = new MyClass();
包名
java解释器工作时:
- 找到环境变量CLASSPATH, CLASSPATH中包含一个或者多个目录,被作为寻找包名的根目录。解释器开始寻找包名并将.替换成/, 从而生成从CLASSPATH的根目录开始的路径名
- CLASSPATH的根目录和形成的路径名连接在一起,成为CLASSPATH内的入口。以后搜索.class文件时,就从这些地方开始查找。
例如包package com.blabla.util包含两个文件
package com.blabla.util;
public class Vector{
public Vector(){
System.out.println("hello Vector");
}
}
---
package com.blabla.util;
public class List{
public List(){
System.out.println("hello List");
}
}
这两个文件都位于com/blabla/util目录下
此外若导入包括相同名字的两个库,在使用该名字时,也需要指定完整名称
如java.util.Vector v = new java.util.Vector();
Eclipse
编码
右键文件夹>properties>Resource>text file encoding 选择Other, 直接键入即可(本人用的ubuntu,下拉选项没有GBK,但是直接键入GBK,apply亦可)
运行
找到有主类的file, run as application
未找到主类
参考这个,很详细的各种原因: https://blog.csdn.net/chenleixing/article/details/44816629
比较实用的是:
- 找不到lib:右键Properties在Java Builder Path的Libraries的标签里面看是否有缺少的,重新引入即可
- 找不到xml: properties>builder里把.xml引入
getting JRE system library unbound
Right click on project—> Build Path–>Configure build path Now there are 4 tabs Source, Projects, Libraries, Order and Export
Go to Libraries tab –> Click on Add Library (shown at the right side) –> select JRE System Library –> Next–>click Alternate JRE –> select Installed JRE–> Finish –> Apply–> OK.
Access denied for user ‘’@’localhost’ to database
- 远程连接的问题
Check if user is allowed for remote connection, run below sql query on your database to allow your user to connect from everywhere.
Allow a user to connect from anywhere
GRANT ALL ON *.* to <user-name>@'<ip>' IDENTIFIED BY '<password>'
Sample for root user :-
GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'root';
// grant root user to connect from everywhere(%) , which has root password.
- 损坏的.classpath和.project
https://stackoverflow.com/questions/59899416/access-denied-for-user-localhost-using-password-no-in-eclipse-instead-o
- Delete the project from Eclipse (not on the disk)
- Close Eclipse
- Go to Project folder and delete .classpath and .project files
- Open eclipse, go to File > Open projects from File System and choose the project directory
- Right click on the project > Run As > Run Configurations and set the right Main class
Java和MySQL
首先mysql-connecter/J对于mysql5.x和mysql8.x和Maria DB使用的是不一样的,需要按需下载不同的mysql-connecter/J 然后java build path中add external JARs,添加这个connecter
对于mysql5,驱动是com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo","root","password");
mysql8.0是不需要建立ssl连接的,需要显示关闭 驱动com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo?useSSL=false&serverTimezone=UTC","root","password");