在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1

注意: Apache Archiva 2024-02 开始已经停止维护 建议使用 JFrog Artifactory 替代。

简介


Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与MavenContinuumANT等构建工具完美结合。Archiva提供的功能包括:远程Repository代理,基于角色的安全访问管理,Artifact分发、维护、查询,生成使用报告,提供基于Web的管理界面等。 本来是Sonatype Nexus更加方便的,但是可惜最新的版本不支持在Tomcat中使用了,因此只能转而使用Apache Archiva

操作步骤


1.下载Apache Archiva

Apache官方网站下载,下载其中的War包。如下图: DownloadArchivaHtml 也可以在本站下载. 具体的命令如下:

 

2.下载Apache Archiva依赖的Jar包

Apache Archiva需要依赖derby-10.10.1.1.jar(或更高版本)(org.apache.derby:derby:10.10.1.1), activation-1.1.jar(javax.activation:activation:1.1),mail-1.4.jar(javax.mail:mail:1.4.7).可以在MVN Repository官网下载。也可以在本站打包下载。 下载完成后,需要放到Tomcat的安装目录下面的lib目录下。 具体的命令如下:

 

3.配置Apache Archiva

(1)停止Tomcat,后续的操作是先关闭Tomcat为前提的。

(2)把下载到的apache-archiva-2.2.1.war重命名成archiva.war然后放到Tomcat安装目录下的webapps目录下面。

(3)在Tomcat的配置文件中增加两项appserver.homeappserver.base,两者都指向相同的目录即可,本例中,都指向了/data/Archiva这个目录。

在脚本的第一行执行代码中增加如下内容:

注意:不要直接修改catalina.sh这个文件,原因在于这个文件每次更新都可能会被替换掉,环境变量的设置都应该在setenv.sh中设置。
注意catalina.sh这个文件中的如下注释

(4)由于Apache Archiva 2.2.1BUG,他没有自动创建必须的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建这些目录。

(5)在Tomcat的配置目录下的Catalina\localhost目录下面创建一个名为archiva.xml的配置文件.

里面的内容如下:

注意其中的Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件,url为数据库的具体存储目录,仅仅包含数据库数据。 注意:Ubuntu系统下面CATALINA_HOME指向/usr/share/tomcat7,而CATALINA_BASE指向/var/lib/tomcat7

(6)启动或者重启Tomcat,等待几分钟之后,即可成功配置完成。

如下图: ApacheArchivaIndexPage 注意,如果在最后一步发生失败,那么我们需要删除/data/Archiva这个目录,以及Tomcat安装目录下面的webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。

注意,上图中的"Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用"admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是"admin",否则会一直提示用户名或密码不正确。

注意,如果使用Apache Httpd(Apache 2.x)作为前端代理Tomcat的情况下部署Apache Archiva,并且使用AJPApache JServ Protocol)的方式进行通信,那么在配置Apache Httpd(Apache 2.x)的配置文件的时候,里面写入的名字必须严格跟Tomcat中部署的名字一致,比如,如果Tomcat配置的时候是archiva,那么在Apache Httpd(Apache 2.x)的配置文件中,也必须使用archiva,不能像其他简单项目一样进行命名重定向。如下:

里面增加的AJP代理信息如下:

更详细的配置说明,参考 Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7

客户端配置


在客户机上找到.m2所在的目录,找到settings.xml这个配置文件,如果不存在,则手工创建,里面的默认内容如下:

在其中的mirrors中间增加如下内容:

修改后的内容变成如下样子:

目前使用的时候,发现,在Apache Archiva刚刚配置完成后,是没办法进行访问的,这个时候一切都返回404,等服务器启动几个小时之后,从中央服务器同步完成数据了,就可以进行访问了,这个问题纠结了好久,最后发现只要等待就可以了,不知道是不是一个通病。
另外就是,在Apache Archiva的搜索页面中使用Search,如果是第一次使用,会发现搜索任何包都提示找不到,原因是因为在设计的时候,只搜索本地已经下载过的包,而在中央仓库中的包是不搜索的,因此会一直提示找不到任何包,只要有任何的客户端调用过,那么就可以在搜索页中找到了,这个问题不必纠结。

引用链接


通过jni获得应用Icon(getApplicationIcon)

jni获得应用icon有两步

1.在java端写一个方法,通过包名获取appIcon,返回byte[]

native初始化时,获取这个method,同时拿到VM和全局context

jobject mBzAppContext;
JavaVM *m_appContext_VM = NULL;

mAppContext = env->NewGlobalRef(thiz);
env->GetJavaVM(&m_appContext_VM);

FIND_CLASS(clazz, "com/xx/xx/xx");
if (clazz == NULL) {
loge("class not exist!!");
}

GET_METHOD_ID(gAppGlobalCallMethod.getAppIcon, clazz,
"getAppIcon", "(Ljava/lang/String;)[B");
if (gAppGlobalCallMethod.getAppIcon == NULL) {
loge("method get fail!!");
}

(Ljava/lang/String;)[B 指入参是String,回参是jbyteArray

2.调用jni函数,拿到byte[],转成char*

void readAppIcon(const char* packageName)
{
if (m_appContext_VM == NULL) {
loge("m_appContext_VM null");
return;
}
if (mAppContext == NULL) {
loge("mAppContext null");
return;
}
if (gAppGlobalCallMethod.getAppIcon== NULL) {
loge("gAppGlobalCallMethod.getAppIcon null");
return;
}
CHECK_JVM_THREAD(m_appContext_VM);
if (error) {
loge("check jvm thread error");
return;
}
jstring jPackageName = env->NewStringUTF(packageName);
jbyteArray jbarray = (jbyteArray)env->CallObjectMethod(mBzAppContext, gAppGlobalCallMethod.getAppIcon, jPackageName);

if (jbarray == nullptr) {
logi("getAppIcon null");
} else {
len = (int)env->GetArrayLength (jbarray);
char *data = (char*)env->GetByteArrayElements(jbarray, 0);
// 这里就把appicon拿到并转成了char*,注意释放data

env->ReleaseByteArrayElements(jbarray, data, 0);
}
if (attached) {
m_appContext_VM->DetachCurrentThread();
}
}

 

在Windows 7系统中的Apache Tomcat 7.0.68上部署Apache Archiva 2.2.1

简介

注意: Apache Archiva 2024-02 开始已经停止维护 建议使用 JFrog Artifactory 替代。


Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与MavenContinuumANT等构建工具完美结合。Archiva提供的功能包括:远程Repository代理,基于角色的安全访问管理,Artifact分发、维护、查询,生成使用报告,提供基于Web的管理界面等。

本来是Sonatype Nexus更加方便的,但是可惜最新的版本不支持在Tomcat中使用了,因此只能转而使用Apache Archiva

操作步骤


1.下载Apache Archiva

Apache官方网站下载,下载其中的War包。如下图:

DownloadArchivaHtml

也可以在本站下载.

2.下载Apache Archiva依赖的Jar包

Apache Archiva需要依赖derby-10.10.1.1.jar(或更高版本)(org.apache.derby:derby:10.10.1.1), activation-1.1.jar(javax.activation:activation:1.1),mail-1.4.jar(javax.mail:mail:1.4.7).可以在Mvn Repository官网下载。也可以在本站打包下载

下载完成后,需要放到Tomcat的安装目录下面的lib目录下。

3.配置Apache Archiva

(1)停止Tomcat,后续的操作是先关闭Tomcat为前提的。
(2)把下载到的apache-archiva-2.2.1.war重命名成archiva.war然后放到Tomcat安装目录下的webapps目录下面。
(3)在开始菜单中找到Tomcat的配置项Configure Tomcat,然后增加两项appserver.homeappserver.base,两者都指向相同的目录即可,本例中,都指向了D:\Archiva这个目录。具体如下图:
ApacheTomcat7Properties
(4)由于Apache Archiva 2.2.1BUG,他没有自动创建一个名为conf的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建D:\Archiva\conf这个目录。
(5)在Tomcat的安装目录下的conf\Catalina\localhost目录下面创建一个名为archiva.xml的配置文件,里面的内容如下:

注意其中的Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件,url为数据库的具体存储目录,仅仅包含数据库数据。
(6)启动或者重启Tomcat,等待几分钟之后,即可成功配置完成。如下图:
ApacheArchivaIndexPage
注意,如果在最后一步发生失败,那么我们需要删除D:\Archiva这个目录,以及Tomcat安装目录下面的webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。

注意上图中的"Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用"admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是"admin",否则会一直提示用户名或密码不正确。

引用链接


AndroidStudio 更改jar包编译顺序优先于android.jar,使用@hide api

使用@hide 的api,可以通过反射,但反射速度慢,且使用不方便。

@hide的api,在编译的时候有问题,如果能编译成功,是可以调用的。那么问题来了,如何编译成功?

可以修改android源码,去掉@hide,编译生成该模块的framework.jar。Eclipse中直接引入该jar包在android.jar前即可。AndroidStudio就比较麻烦,需要做两步。

1.引入jar包,这个网上有无数方法,不表。注意设置compile->provide,gradle文件如下:

原因就是我们只需要编译成功,不需要把这个包打到系统。

这时候在系统自动生成的iml文件中,可以看到一排orderEntry标签 <orderEntry>,也就是我们引用的所有jar包信息,把framework的jar包放到orderEntry的第一位,也就是

前面,这时候IDE就不报错了。

不过只是表象,方便我们写代码自动补全而已。而且iml文件是自动生成的,每次重启IDE都要重新改一下。

2.真正的编译需要在工程的gradle中增加编译选项

找到

在repositores同级增加

Xbootclasspath/p:是Java编译的寻址优先设置,先找缺省路径还是全路径

不确定路径怎么填的,可以使用绝对路径,如

编译通过

Tips:

1.有时候@hide的api编译过了,其他地方又报错。查看一下报错的api,看看是不是对android版本有要求,framework.jar编译最好用较新的编译环境。

2.不要做过多的其他尝试,这两步绝对可以解决问题。

IntelliJ IDEA2016.2使用Gradle创建Java Web应用

1.如下图,第一步很简单的,File->New->Project
20160502164417038

2.如下图,完成第一步后,会弹出这样一个窗体,然后在左边栏目找到Gradle,然后在右边勾选JavaWeb两个选项,最后点击Next
20160502164806993
3.如下图,到了输入GroupIdAcrtifactId窗口了,对于这两个名字的解释

GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。
ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
一般来说,包的命名习惯是域名的反过来,加个公司或者个人的名称吧,个人习惯。www.demo.com -> com.richard.demo; 那么都知道,test是项目名称,也是在最后面的,所有项目组的唯一标识符(groupId):com.richard, 项目的唯一标识符(ArtifactId)demo.

然后点击Next
20160502165336980

4. 如下图,这个页面,刚进来默认选择的是Use default gradle wrapper(recommended), 我不选择这个是因为我本地有装Gradle,所有不需要是用它默认的,如果选择它,那么创建项目之后,它就会去自动下载Gradle,然后配置好,下载过 程一般都很慢,至少我在我电脑上很慢。所有我选择的是Use local gradle distribution,。然后上面还有一个勾选,就是自动创建空的根目录文件夹,如果不选择,创建完的项目会没有Java文件夹,所以勾选,让它自动创建吧,继续点击Next
20160502172330113
5. 如下图,它默认的就是ArtifactId的名字,项目的唯一标识嘛,然后module name,如果不清楚应该填什么,可以按照默认的无所谓,点击Finish,创建就这样完成了。
20160502172559648
6.创建完成之后,如果你之前没有配置Tomcat的话,是没办法运行的,所以也需要配置Tomcat,如下图, 左侧是成功创建的项目文件目录,如果之前没有勾选Create directories for empty content roots automatically, 那么就不会生成javaresource这个两个孔文件夹。这不的重点是点击Edit configuration
20160502173439340
6. 弹出如下图配置框,点击左上角加号,往下滚动找到Tomcat Server->Local,点击Local.
20160502174005936
7. 如下图,弹出配置框,默认是配置Server属性,输入这个配置的名字,name,可以取任意的名字,点击Configure选择本地Tomcat的路径,都配置好了直接点击OK就可以运行了。
20160502174445592
8.如下图,然后选择Server旁边的Deployment, 页面之后,点击加号,在弹出的页面选择名字更长的那个,也就是后面有(exploded)的那条,点击OK
20160502175547163

9.如下图,在右侧输入Application context的名字,这个对应就是等会儿运行时,默认路径(http://localhost:8080/demo/)中的demo, 所以如果你不配置这项,它的默认路径将会是(http://localhost:8080/)这样的。最后点击Apply, 再点击OK.
20160502180004992
10.倒数第二步了,如下图,打开index.jsp页面,长方形圈出来的是系统默认生成的,不用管,可以删掉,然后圆圈的是我自己写的。我只是为了让你知道,jsp页面长啥样子的,免得你看到它,以为是生成错文件了,点击有上角的运行按钮。
20160502180443932

11.最后一步,见证如下成果。
20160502180826574

参考链接


IntelliJ IDEA2016.1 + maven 创建java web 项目

calling startactivity() from outside of an activity context requires the flag_activity_new_task flag. Is this really what you want?

今天遇到一个错误,莫名戳中笑点,好贴心好长的提示。

原因:使用application startActivity,必须使用FLAG_ACTIVITY_NEW_TASK,因为新起来的Activity没办法和application放到一个task中,必须用FLAG_ACTIVITY_NEW_TASK让新启动的ACTIVITY独占一个TASK。

statfs获得硬盘信息

statfs结构如下:

struct statfs
{
long    f_type;     /* 文件系统类型  */
long    f_bsize;    /* 经过优化的传输块大小  */
long    f_blocks;   /* 文件系统数据块总数 */
long    f_bfree;    /* 可用块数 */
long    f_bavail;   /* 非超级用户可获取的块数 */
long    f_files;    /* 文件结点总数 */
long    f_ffree;    /* 可用文件结点数 */
fsid_t  f_fsid;     /* 文件系统标识 */
long    f_namelen;  /* 文件名的最大长度 */
};

statfs接口调用成功返回0,失败返回-1.

简单用法:
int resultCode = statfs(path.c_str(), &data);
if (resultCode < 0) {
return false;
} else {
unsigned long freeSize = data.f_bsize * data.f_bfree;
unsigned long availSize = data.f_bsize * data.f_bavail;
unsigned long totalSize = data.f_bsize * data.f_blocks;
}

单位bytes,使用>>20转为MB。

Android中对SD卡/U盘挂载和卸载的监听

Android系统中,当SD卡挂载在电脑上时候,如果手动将语音备忘录中的录音删除的时,那么相应数据库中的数据也是需要修改的。此时实现需要对挂载进行监听,需要继承BroadcastReceiver类,实现其中的onRecieve(Context context, Intent inten)方法。代码如下:

此时须在Manifest中进行注册:

参考链接


android中对SD卡挂载和卸载的监听