Java 笔记 —— java 和 javac

h2 { color: #4ABCDE }
a { color: blue; text-decoration: none }
a:hover { color: red; text-decoration: underline }
pre { border: solid 1px #CCCCCC; background-color: #F8F8F8; overflow: auto; font-size: 15px; font-family: consolas, courier, monospace; line-height: 20px; padding: 6px 10px }
p.textRight { text-align: right }
span.bold1 { font-weight: bold }
span.color1 { color: red }
p.header { font-size: 22px; font-family: 楷体, arial, 微软雅黑; color: #787878; font-weight: bold }

阅读目录

  • Java JDK 安装
  • PATH
  • CLASSPATH
  • 小结
  • javac 命令
  • java 命令
  • 小结
  • 生成 jar 包

一、Java JDK 安装

1)JDK 在安装的过程中会出现两次安装提示,第 1 次是安装 JDK ,第 2 次是安装 JRE。我把 JDK 安装在 D:\Java\jdk\ 这个路径下,把 JRE 安装在 D:\Java\jre\ 这个路径下

2)在配置 PAHT 和 CLASSPATH 的值时,是对 JDK 安装路径的配置,与 JRE 安装路径无关(当然这只是一般情况下)

[ 返回顶部 ]


二、PATH

1) PATH 要配置的路径是:;D:\Java\jdk\bin;D:\Java\jdk\jre\bin(这里配置了两个路径,英文分号是每个路径的分隔符)。通常我们会增加一个变量 JAVA_HOME,它的值配置为:D:\Java\jdk(注意这里不用分号开头,也不用分号结尾),因此 PATH 的值通常配置为:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

2)添加 JAVA_HOME 变量的好处:当我重新安装 JDK 的时候,如果我想改变 JDK 的安装路径为 E:\Java\jdk\ ,当我没有配置 JAVA_HOME 时,我必须一个一个地去更改 PATH 的值,比如改为 ;E:\Java\jdk\bin;E:\Java\jre\bin ,但是如果我有配置 JAVA_HOME 的值,那我只需更改 JAVA_HOME 的值为 E:\Java\jdk 就行了,PATH 的值可以保持不变

3)配置 PATH 环境变量的作用:我们用命令行编译运行 Java 程序时,会经常用到 java 和 javac 这两个命令,当我们还没设定 PATH 的值的时候,这两个命令是没办法在命令行的任意文件目录下执行的,那么配置 PATH 值就是为了让这两个命令可以执行

4)java 和 javac 命令的工作原理:我们到 jdk 的安装路径下可以看到有一个 bin 文件夹,进入 bin 文件夹里面会发现 java 和 javac 就在这里。java 和 javac 都是 .exe 程序,在命令行中如果想要执行 .exe 程序,那么必须要从命令行进入到放置 .exe 程序的目录下,我们可以在命令行中输入 cd   /d   D:\Java\jdk\bin 命令,然后命令行会进入 bin 文件目录下,这时,即使我们没有配置 PATH 的值,也可以执行 java 和 javac 命令,可以在命令行输入 java   -version 命令试试。但是如果我们想在命令行的任何目录下都能执行 java 和 javac 命令那该怎么办呢?显然,要配置 PATH 的值。当我们执行 java 命令时,系统首先会在当前目录下寻找是否有 java.exe 程序,有,那么就执行,没有,那么就会去 PATH 里面寻找,所以,当我们配置好 PATH 之后,在任何目录下执行 java 和 javac 都会生效

[ 返回顶部 ]


三、CLASSPATH

1)CLASSPATH 的值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(这里配置了 3 个路径,其中 . 符号表示本地路径,其他两个路径都可以在 JDK 的安装路径下面找到)

2)配置 CLASSPATH 的作用:寻找 .class 文件。例如:如果我有个 Java 程序在 E:\Example\ 路径下,文件名称为 Test.java 。要编译程序,那首先要将命令行切换到 E:\Example\ 目录(在命令行处输入命令 cd   /d   E:\Example\), 然后执行 javac   Test.java 命令将 .java 文件编译成 .class 文件。没有配置 CLASSPATH 时:我们可以直接在命令行的 E:\Example\ 目录下执行 java   Test 命令,能够执行成功的原因是在没有配置 CLASSPATH 时,系统会默认在本地目录下寻找编译后的 Test.class 文件。有配置 CLASSPATH 时:假如我随便在 CLASSPATH 中添加一个路径 F:\; ,那么系统便不会默认在本地目录下寻找,这时我们也想要在命令行的 E:\Example\ 目录下执行 java   Test 命令,则 CLASSPATH 应该配置成 .;F:\;( . 符号就表示本地目录)

3)再举个例子:我的 CLASSPATH 已经配置成: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar ,现在我将编译好的 Test.class 文件放在 D:\ExampleClass\ 路径下,那么我想要在命令行中执行 java   Test 命令要怎么办呢?有两种方法,第一种方法:我将命令行切换到 D:\ExampleClass\ 目录下,然后可以直接执行 java Test 命令(因为 CLASSPATH 配置了 . 符号,能在本地目录下寻找 Test.class 文件)。第二种方法:将 D:\ExampleClass\ 路径添加到 CLASSPATH 中,即 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;D:\ExampleClass ,这时我们就可以在命令行中的任何目录下执行 java Test

[ 返回顶部 ]


四、小结

1)配置 PATH 是为了使 java 和 javac 命令能在命令行的任何目录下执行

2)配置 CLASSPATH 是为了执行 java   Test 命令时,能够找到 Test.class 文件

3)PATH 和 CLASSPATH 的配置都与 JDK 的安装路径有关,与 JRE 的安装路径无关(当然这只是一般情况下)

4)向 CLASSPATH 添加指定路径之后可以使 java   Test 在命令行的任何目录下执行;使用绝对路径可以使 javac   E:\Example\Test.java 在命令行的任何目录下执行

[ 返回顶部 ]


五、javac 命令

  1. 格式:javac [options] [source files]
  2. 常用的 options 有:
    • -d   <目录> ,该选项用于编译时将 .class 和 .java 文件分开存放
    • -sourcepath   <路径> ,该选项用于编译时指定 .java 文件的位置
    • -classpath   <路径> ,该选项用于编译时指定 .class 文件的位置
  3. 用法

无 options

假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件。

例如:javac   D:\sources\Test.java ,可以在命令行的任何目录下输入该命令,编译后,系统默认会在 D:\sources\ 路径下生成 Test.class 文件

-d   <目录>(使用该选项之前要先在计算机中建立目录)

假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件。

例如:javac   -d   E:\myclasses   D:\sources\Test.java ,可以在命令行的任何目录下输入该命令,编译后,系统会在 E:\myclasses\ 路径下生成 Test.class 文件 (注意:必须要先在计算机中建立 E:\myclasses\ 路径)

-sourcepath   <路径>

例1(.java 文件在同一个包下):

// 假设该文件位于 E:\com\example\ 路径下,文件名为 Fruits.java

package com.example;

public class Fruits{
	@Override
	public String toString(){
		return "Fruits";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;

public class Test{
	public static void main(String[] args){
		System.out.println(new Fruits()); // 引用 Fruits 对象
	}
}

程序:

  • 两个 .java 文件位于同一个包下(因为都是 package com.example)
  • Test 引用了 Fruits 对象

编译 Test.java 文件的方法:(要先在计算机中建立 D:\classes\ 路径)

  • 第一种方法:将命令行切换到 D:\sources\ 目录下,然后执行 javac   -sourcepath   E:\   -d   D:\classes   Test.java
  • 第二种方法:在命令行的任意目录下,执行 javac   -sourcepath   E:\   -d   D:\classes   D:\sources\Test.java 命令
  • 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E:\ 然后在命令行的任意目录下执行 javac   -d   D:\classes   D:\sources\Test.java

运行 Test.class:

  • 将命令行切换到 D:\classes\ 目录下,然后执行 java   com.example.Test

例2(.java 文件在不同的包下):

// 假设该文件位于 E:\hzl\net\example\ 路径下,文件名为 Person.java

package net.example;

public class Person{
	@Override
	public String toString(){
		return "Person";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;
import net.example.Person; // 要导入包

public class Test{
	public static void main(String[] args){
		System.out.println(new Person()); // 引用 Person 对象
	}
}

程序:

  • 两个 .java 文件位于不同的包(package net.example; 和 package com.example;)
  • Test 引用了 Person 对象

编译 Test.java 文件的方法:(首先要在计算机中建立 D:\yourclasses\ 路径)

  • 第一种方法:将命令行切换到 D:\sources\ 目录下,然后执行 javac   -sourcepath   E:\hzl   -d   D:\yourclasses   Test.java 命令(注意:如果我将 Person.java 中的包名改为 package hzl.net.example; 那么 Test.java 中的 import 应该改为 import hzl.net.example.Person; 要执行的编译命令应该为 javac   -sourcepath   E:\   -d   D:\yourclasses   Test.java)
  • 第二种方法:在命令行的任意目录下执行 javac   -sourcepath   E:\hzl   -d   D:\yourclasses   D:\sources\Test.java
  • 第三种方法:向计算机环境变量 CLASSPATH 中添加 ;E:\hzl 然后在命令行任意目录下执行 javac   -d   D:\yourclasses   D:\sources\Test.java

运行 Test.class:

  • 将命令行切换到 D:\yourclasses\ 目录下,然后执行 java com.example.Test

例3(-sourcepath 的本质):

执行包含该选项的命令时,系统会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

// 假设该文件位于 E:\net\example\ 路径下,文件名为 Man.java

package net.example;

public class Man{
	@Override
	public String toString(){
		return "Man";
	}
}
// 假设该文件位于 F:\cn\example\ 路径下,文件名为 Woman.java

package cn.example;

public class Woman{
	@Override
	public String toString(){
		return "Woman";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;
import net.example.Man;
import cn.example.Woman;

public class Test{
	public static void main(String[] args){
		System.out.println(new Man()); // 引用 Man 对象
		System.out.println(new Woman()); // 引用 Woman 对象
	}
}

程序:

  • 有三个 .java 文件位于不同的包
  • Test 引用了 Man 和 Woman 对象

1、还没配置 CLASSPATH 时:

编译:(首先要在计算机中建立 D:\myclasses\ 路径)

  • 在命令行的任何目录下执行 javac   -sourcepath   E:\;F:\   -d   D:\myclasses   D:\sources\Test.java

运行:

  • 将命令行切换到 D:\myclasses\ 目录下,然后执行 java   com.example.Test

2、CLASSPATH 的值配置为 .;E:\ (. 符号表示本地目录,E:\ 是存放 Man.java 文件的路径):

编译:

  • 在命令行的任何目录下执行 javac   -sourcepath   F:\   -d   D:\myclasses   D:\sources\Test.java(编译不能通过,虽然说已经将 Man.java 的路径配置到了 CLASSPATH 中,但是程序还是找不到 Man.java ,这是因为在指定 -sourcepath 的 <路径> 时,该路径会暂时覆盖掉 CLASSPATH 中的值)

3、想让编译通过:

  • 第一种方法:将 E:\ 和 F:\ 都配置到 CLASSPATH 中,即 CLASSPATH 的值为 .;E:\;F:\ ,然后在命令行的任何目录下执行 javac   -d   D:\myclasses   D:\sources\Test.java
  • 第二种方法:不管 CLASSPATH 的值是什么,直接在命令行的任何目录下执行 javac   -sourcepath   E:\;F:\   -d   D:\myclasses   D:\sources\Test.java

-classpath   <路径>

同样,执行包含该选项的命令时,系统会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

-sourcepath 能实现的功能,-classpath 同样能实现, 但是 -classpath 能实现的功能,-sourcepath 不一定能实现,例如:

很多时候,我们只有 .class 文件或者只有由 .class 文件组成的 jar 包,那么我们在编译程序的时候就不能用 -sourcepath 而是要用 -classpath 来指定路径,使程序能编译通过

// 假设该文件位于 D:\cn\example\ 路径下,文件名为 Animals.java
// 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:\cn\example\ 路径下

package cn.example;

public class Animals{
	@Override
	public String toString(){
		return "Animals";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;
import cn.example.Animals; // 导入包

public class Test{
	public static void main(String[] args){
		System.out.println(new Animals()); // 引用 Animals 对象
	}
}

程序:

  • 假如我现在只有 Animals.class 文件,没有 Animals.java 文件(Animals.class 文件位于 F:\cn\example\ 路径下)
  • Test 类引用了 Apple 对象

编译 Test.java 文件的方法:(首先要在计算机中建立 D:\myclasses\ 路径)

  • 在命令行的任何目录下运行 javac   -classpath   F:\   -d   D:\myclasses   D:\sources\Test.java(其中 -classpath 指定了 Apple.class 的路径)

运行 Test.class:

  • 在命令行的任何目录下执行 java   -classpath   D:\myclasses;E:\   com.example.Test

[ 返回顶部 ]


六、java 命令

  1. 格式:java   [options]   [class files]
  2. 常用的 options 有:
    • -classpath   <路径>
  3. 用法

-classpath   <路径>

例1:

// 假设该文件位于 D:\cn\example\ 路径下,文件名为 Animals.java
// 假设我已经将它编译成 Animals.class 文件,并且将它放在 F:\cn\example\ 路径下

package cn.example;

public class Animals{
	@Override
	public String toString(){
		return "Animals";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;
import cn.example.Animals; // 导入包

public class Test{
	public static void main(String[] args){
		System.out.println(new Animals()); // 引用 Animals 对象
	}
}

编译:

  • 在命令行的任何目录下执行 javac   -classpath   F:\   -d   D:\myclasses   D:\sources\Test.java

运行:

  • 在命令行的任何目录下执行 java   -classpath   D:\myclasses;F:\   com.example.Test

例2:

执行包含该选项的命令时,系统也会将指定的 <路径> 暂时覆盖掉 CLASSPATH 中的路径

// 假设该文件位于 D:\sources 路径下,文件名为 Test.java

package com.example;

public class Test{
	public static void main(String[] args){
		System.out.println("Hello World !");
	}
}

1、没有配置 CLASSPATH 的值时:

编译:

  • 在命令行的任何目录下执行 javac   -d   D:\myclasses   D:\sources\Test.java

运行:

  • 将命令行切换到 D:\myclasses\ 目录下,然后执行 java   -classpath   .   com.example.Test(-classpath 中的 <路径> 为 . 符号,表示指定了本地目录)

2、将 CLASSPATH 的值配置成 . 符号

编译:

  • 在命令行的任何目录下执行 javac   -d   D:\myclasses   D:\sources\Test.java

运行:

  • 将命令行切换到 D:\myclasses\ 目录下,然后执行 java   -classpath   E:\   com.example.Test(运行时会找不到 Test.class 文件,因为我将 -classpath 中的 <路径> 指定为 E:\ ,它会暂时覆盖掉 CLASSPATH 中的值)

[ 返回顶部 ]


七、小结

1)javac

  • -sourcepath 和 -classpath 都和 CLASSPATH 有关
  • 如果指定 -sourcepath 或者 -classpath ,那么他们的 <路径> 会暂时覆盖掉 CLASSPATH 中的值
  • 如果不指定 -sourcepath 或者 -classpath ,那么在编译程序时,系统会自动到 CLASSPATH 中寻找相应的路径

2)java

  • -classpath 也和 CLASSPATH 有关
  • 如果指定 -classpath ,那么它的 <路径> 会暂时覆盖掉 CLASSPATH 中的值
  • 如果不指定 -classpath ,那么在运行程序时,系统会自动到 CLASSPATH 中寻找相应的路径

3)程序编译和运行的步骤

// 假设该文件位于 E:\net\example\ 路径下,文件名为 Person.java

package net.example;

public class Person{
	@Override
	public String toString(){
		return "Person";
	}
}
// 假设该文件位于 D:\sources\ 路径下,文件名为 Test.java

package com.example;
import net.example.Person;

public class Test{
	public static void main(String[] args){
		System.out.println(new Person()); // 引用 Person 对象
	}
}

编译:

  • 在命令行的任何目录下执行 javac   -sourcepath   E:\   -d   D:\myclasses   D:\sources\Test.java
  • 编译时,系统首先根据上面的命令找到 D:\sources\ 目录下的 Test.java 文件,这是一个包含主类的 .java 文件
  • 然后根据 -sourcepath E:\ 和 Test.java 文件中的 import net.example.Person; 语句找到 E:\net\example\ 路径下有 package net.example; 语句的 Person.java 文件(没有指定 -sourcepath 时,系统会去 CLASSPATH 中寻找,其实指定 -sourcepath 时,系统也是去 CLASSPATH 中寻找,因为 -sourcepath 的作用是暂时覆盖掉 CLASSPATH 的值)
  • 最后将编译好的 .class 文件存放在 D:\myclasses\ 路径下
  • 整个过程:包含主类的 .java 文件 ——> CLASSPATH ——> import 语句 ——> 找到含有相应 package 语句的 .java 文件

运行:

  • 在命令行的任何目录下执行 java   -classpath   D:\myclasses   com.example.Test
  • 运行时,系统会根据 -classpath D:\myclasses 和 com.example.Test 找到 D:\myclasses\com\example\ 路径下的 Test.class
  • 然后根据 -classpath D:\myclasses 和 import net.example.Person; 语句找到 D:\myclasses\net\example\ 路径下有 package net.example; 语句的 Person.class

[ 返回顶部 ]


八、生成 jar 包

1)假设计算机中有一个 D:\classes\ 路径,该路径下有 a.class ,b.class 和 c.class 三个文件

2)将命令行切换到 D:\classes\ 目录下,然后执行 jar   -cvf   Test.jar   *.class

3)查看 D:\classes\ 路径,会发现生成了一个 Test.jar 文件,这个文件中就包含了 a.class ,b.class 和 c.class 三个文件

[ 返回顶部 ]


End~

原文地址:https://www.cnblogs.com/huangzenglie/p/8724919.html

时间: 2024-11-14 11:58:25

Java 笔记 —— java 和 javac的相关文章

Java笔记-Java相关概念和如何实现跨平台

一.Java相关概念 1.Java语言的核心特点跨平台面向对象 2.Java的历史版本JDK1.0,JDK1.1,JDK1.2....JDK5.0,JDK6.0,JDK7.0,JDK8.0 注意:JDK5.0是一个标志性的版本,该版本引入了很多新特性. 3.Java的分类Java从1.2开始,分为三个不同的分支 JavaSE(Java Standard Edition),Java标准版,专门用来开发桌面级应用JavaEE(Java Enterprise Edititon),Java企业版,专门开

14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格

布局管理器 读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变.那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种"布局",要管理这些布局,就需要本节学习的布局管理器. 管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的

12.7-全栈Java笔记:Java网络编程(五)

UDP通讯的实现 1.DatagramSocket:用于发送或接收数据包 当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象.服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收. DatagramSocket有两种构造函数.一种是无需任何参数的,常用于客户端.另一种需要指定端口,常用于服务器. 常用方法:send.receive. cl

12.4-全栈Java笔记:Java网络编程(二)

 基于TCP协议的Socket编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器.一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别. "请求-响应"模式: Socket类:发送TCP消息 ServerSocket类:创建服务器 套接字是一种进程间的数据交换机制.这些进程既可以在同一机器上,也可以在通过网络连接的不同机器上.换句话说,套接字起到通信端点的作用.

12.3-全栈Java笔记:Java网络编程(一)

Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能.Java虚拟机负责提供与操作系统的实际连接.  InetAddress 作用:封装计算机的IP地址和DNS(没有端口信息!). 特点:这个类没有构造函数.如果要得到对象,只能通过静态方法:getLocalHost.getByName. getAllByName. getAddress.getHostName. [示例1]使用getLocalHost方法创建InetAddress对象 InetAddress ad

11.2-全栈Java笔记:Java中如何实现多线程

在JAVA中使用多线程非常简单,我们先学习如何创建和使用线程,然后结合案例再深入剖析线程的特性. 通过继承Thread类实现多线程 继承Thread类实现多线程的步骤: 1. 在Java中负责线程的这个功能的是java.lang.Thread 这个类 2. 可以通过创建 Thread 的实例来创建新的线程. 3.  每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体. 4.   通过调用Thead类的start()方法来启动一个线程. [示

12.5-全栈Java笔记:Java网络编程(三)

上节回顾:在学习了Socket在建立客户端和服务器单项通讯中,分别创建独立的Socket,并通过Socket的属性. 那么如何将两个Socket进行连接,从而达到客户端和服务器之间建立输入输出流进行通信呢?在上节中我们已经讲到,TCP/IP套接字是最可靠的双向流协议,使用TCP/IP可以发送任意数量的数据.如果发送方和接收方计算机确定好端口,他们就可以通信了,其中的端口用套接字表示. [示例1]客户端与服务器端双向交流的Socket之服务器端 import java.io.BufferedRea

14.2-全栈Java笔记: Java Swing创建窗口,原来这么简单!!!

上节我们聊到GUI(Graphical User Interface)的概念,并学习GUI编程中主要需掌握两个包,分别是:AWT和Swing,本节我们会通过Swing程序中常用的类和控件来实现第一个窗口.  javax.swing.JFrame JFrame在GUI中为一个窗口对象,继承于Frame.JFrame控件用于在Swing程序中创建窗体.如表1所示,为JFrame常见的构造方法. 注意: Java语言规定在GUI编程中任何窗口实例化出来时默认为不可见(即隐藏)状态,所以当我们使用构造方

12.6-全栈Java笔记:Java网络编程(四)

上节回顾:在学习了Socket建立客户端和服务器双向交流后,我们发现它的问答形式不够灵活. 本节课我们讲解如何在服务器和客户端之间实现聊天室~ 需要思考的问题: 服务器端:一个线程专门发送消息,一个线程专门接收消息. 客户端:一个线程专门发送消息,一个线程专门接收消息. 除了消化这段代码外,还需要思考,怎么实现一个聊天室!(难度较大!!) [示例1]聊天室服务器端 import java.io.BufferedReader; import java.io.BufferedWriter; impo

14.1-全栈Java笔记: Java语言中GUI到底是神马鬼?| AWT | Swing

到目前为止,我们在Java中编写的基本都是基于控制台的程序:而Java编程语言之所以如此流行的一个主要原因之一,就是因为它支持图形用户界面功能,即GUI(Graphical User Interface). GUI(Graphical User Interface)即图形用户界面,就是应用程序提供给我们用户操作的图形界面,包括窗口.菜单.工具栏及其它多种图形界面元素,如文本框.按钮.列表框.对话框等.它能使应用程序显得更加友好. 学习Java的GUI编程主要是要掌握两个包,分别是:java.aw