Menu
Woocommerce Menu

有关两个jar包中包含完全相同的包名和类名的加载问题,Linux下设置和查看环境变量

0 Comment


有关两个jar包中包含完全相同的包名和类名的加载问题,jar包中

首先从表现层介绍,后续后深入原理。

1,先简单介绍maven如何生成jar文件方便测试


    

<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>Main.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
配置了一个manifest标签来配置Main函数的入口。然后通过如下指令来实现打包。

mvn assembly:assembly

2.自定义两个jar包,其中包含相同包名和类名


       与export的导入顺序有关。只会加载第一个,并且运行正常。

3.自定义jar和jdk包, 其中包含相同的包名和类名


   
 与export的导入顺序有关。同样是只会加载第一个,但是如果加载自定义的jar运行会报错。加载
jdk正常。

 protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

4.mvn jar包冲突常用命令


  mvn dependency:analyze,mvn dependency:tree

 

 

首先从表现层介绍,后续后深入原理。
1,先简单介绍maven如何生成jar文件…

Linux的变量种类

按变量的生存周期来划分,Linux变量可分为两类:

1
永久的:需要修改配置文件,变量永久生效。
2
临时的:使用export命令声明即可,变量在关闭shell时失效。

本文采用CXF+Spring开发WebService,开发环境为MyEclipse10,Demo结构图如下:

设置变量的三种方法

1
在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。

例如:编辑/etc/profile文件,添加CLASSPATH变量

#
vi /etc/profile
export
CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注:修改文件后要想马上生效还要运行#
source /etc/profile不然只能在下次重进此用户时生效。

2
在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】

用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。

例如:编辑guok用户目录(/home/guok)下的.bash_profile

$ vi /home/guok/.bash.profile
添加如下内容:
export
CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$
source /home/guok/.bash_profile不然只能在下次重进此用户时生效。

3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)

在shell的命令行下直接使用[export
变量名=变量值] 定义变量,

该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,

shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

图片 1

环境变量的查看

1 使用echo命令查看单个环境变量。例如:

echo $PATH
2 使用env查看所有环境变量。例如:

env
3
使用set查看所有本地定义的环境变量。

具体实现过程:

使用unset删除指定的环境变量

set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:

$
export TEST=”Test…” #增加一个环境变量TEST
$
env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test…

unset 
TEST #删除环境变量TEST
$
env|grep TEST #此命令没有输出,证明环境变量TEST已经删除

1.首先在MyEclipse10中新建一个webservice工程,命名为CXFSimpDemo,工程建完之后,右键属性添加CXF类库,本文使用的是现今最新的2.7.0版本。

常用的环境变量

PATH
决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE
 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121192.htm

图片 2

2.然后在项目中新建接口和类,具体实现代码如下所示:

接口IGetName实现:

1 package com.snail;
2 import javax.jws.WebService;
3 @WebService
4 public interface IGetName 
5 {
6     public String getName(String name);
7 }

类GetNameImpl实现:

 1 package com.snail;
 2 import javax.jws.WebService;
 3 @WebService(endpointInterface="com.snail.IGetName")
 4 public class GetNameImpl implements IGetName {
 5     @Override
 6     public String getName(String name) {
 7         return name;
 8     }
 9 
10 }

3.在src里新建Spring配置文件applicationContext.xml,鉴于CXF本身已经集成了Spring框架,因此我们无须再添加Spring类库,具体实现代码如下:

标签:,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图