标签 Java 下的文章

Jetty提供了一个Web服务器和javax.servlet容器,为SPDY、WebSocket、OSGi、JMX、JNDI、JAAS以及许多其它集成套件添加了支持。这些组件都是开源的,也可用于商业用途和分发。

Jetty被广泛用于多种项目和产品,都可以在开发环境和生产环境中使用。Jetty可以很容易地嵌入到设备、工具、框架、应用服务器以及集群中。更多用途可参见Jetty网页。

Jetty特性

  • 全功能并基于标准
  • 开源与商用两可
  • 灵活和可扩展
  • 小足迹
  • 可嵌入
  • 异步支持
  • 企业弹性扩展
  • Apache和Eclipse双重许可证

ubuntu 14.10 server上安装Jetty 9

先决条件

在安装Jetty服务器前,您需要通过以下命令安装Java

sudo apt-get install openjdk-8-jdk

Java将会安装到/usr/lib/jvm/java-8-openjdk-i386,同时在该目录下会创建一个名为java-8-openjdk-i386的符号链接,在/usr/bin/java下也会相应创建符号链接。

现在你需要从这里下载Jetty9,在下载完成后,你需要使用以下命令来解压缩

$tar -xvf jetty-distribution-9.2.5.v20141112.tar.gz

该操作会将它解压到jetty-distribution-9.2.5.v20141112,而你需要使用以下命令将归档文件移动到/opt/jetty

$mv jetty-distribution-9.2.5.v20141112 /opt/jetty

你需要创建jetty用户,并将其设置成/opt/jetty目录的属主

sudo useradd jetty -U -s /bin/false
sudo chown -R jetty:jetty /opt/jetty

使用以下命令拷贝Jetty脚本到启动目录,以便让它作为一个服务来运行

$ cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty

现在,你需要使用以下内容来创建Jetty设置文件

sudo vi /etc/default/jetty

添加以下行

JAVA_HOME=/usr/bin/java
JETTY_HOME=/opt/jetty
NO_START=0
JETTY_ARGS=jetty.port=8085
JETTY_HOST=0.0.0.0
JETTY_USER=jetty 

保存并退出该文件

你需要使用以下命令来启动Jetty服务

sudo service jetty start

你应该看到和下面类似的输出

Starting Jetty: OK Mon Nov 24 11:55:48 GMT 2014

如果你看到了下面的错误

** ERROR: JETTY\_HOME not set, you need to set it or install in a standard location

你需要确保在/etc/default/jetty文件中设置了正确的Jetty家目录路径,你可以使用以下URL来测试jetty。

Jetty现在应该运行在8085端口,打开浏览器并访问http://服务器IP:8085,你应该可以看到Jetty屏幕。

Jetty服务检查

使用以下命令来验证并检查配置

sudo service jetty check

使用以下命令来让Jetty开重启后自动启动

sudo update-rc.d jetty defaults

重启服务器并测试Jetty是否自动启动。

要检查Jetty运行在哪个端口上,或者该端口是否与其它程序冲突,可以运行netstat -tln


via: http://www.ubuntugeek.com/install-jetty-9-java-servlet-engine-and-webserver-on-ubuntu-14-10-server.html

作者:ruchi 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

本文并没有什么新鲜的。我只是收集了一些不太重要的语句,但这些语句可能对初级程序员来说很重要。也就是些无聊的旧东西。

如果以下的这些你都知道的话,那么你比Java的了解已经超过了对一个平常的家庭主妇的了解。我不知道清楚所有的这些是否是有意义的。即使不知道其中的一些特性,你照样也可以成为一个相当不错的Java程序员。然而,本文中许多的新信息可能表明你还有很大的发展空间。

Java中有四种不同的访问类型(而不是三种)

这四种类型包括:private, package private (包访问权限,无修饰符,又叫default, 译者注)。如果你在类中定义一个元素时并不加任何访问类型修饰符,它将被默认设置为包访问权限(package private),而不是public或者protected。

Java中有四种级别的访问类型

Java有四个级别的访问类型。

从另一方面来说,如果在接口中,你不指定方法的访问修饰符,那么它将是public类型的。你也可以显式地指定它为public类型, 但这并不符合SONAR(一个开源代码质量管理平台,译者注)的代码质量管理思想。

访问类型是传递的

访问类型是传递的

我的“在Java中允许选择性的在接口的方法中写public”的观点是一个技术错误。

同样你也可在接口的字段前写final,甚至是static。这说明这些字段可以是非静态或非final吗?不是的,接口中的字段中总是final和static的。

Protected和package private是不一样的

Package private(或者default)访问类型可以使得相同包(package)下其他类能够访问这些字段或方法。保护类型(protected)的方法和字段可以被相同包下的类使用(这和package private是一样的),同时它也可以被其他类使用,只要那个类继承了这个包含这些protected方法或字段的类。

Protected是可传递的

如果有三个包a、b、c,每个包都分别包含A、B、C类,而且B继承A,C继承B,那么C可以访问A中的protected字段和方法。

package a;

public class A {
    protected void a() {

    }
}
package b;

import a.A;

public class B extends A {
    protected void b() {
        a();
    }
}
package c;

import b.B;

public class C extends B {
    protected void c() {
        a();
    }
}

接口不能定义protected方法

很多人认为可以在接口中定义protected方法。如果你这么做的话,编译器很快就会毫不留情地给你报错。顺便说下,这也就是我为什么认为允许public关键字在接口中是一个技术错误,它会让人觉得还可以写其他访问类型似的。

Private is the new public

private是一种新的public

如果你还想在一个接口的方法中声明protected方法,你可能还不理解封装的含义。

此private非彼private

私有变量和方法在编译单元内是可见的。如果这听起来太神秘的话,换种说法:几乎就是在同一个Java文件中。这比“在它们被定义的类中”听起来好理解些。它们在同一编译单元的类和接口中也是可见的。嵌套类可以看到类中封装的私有字段和方法。然而,当前封闭类也可以看到该类下任何深度下类中的私有方法和字段。

package a;

class Private {
    private class PrivateInPrivate {
        private Object object;
    }

    Object m() {
        return new PrivateInPrivate().object;
    }
}

后者并不广为人知,事实上也很少有用到。

Private是类的访问级别而不是对象

如果你可以访问一个变量或方法,那么不管它属于哪个对象你都可以访问它。如果this.a可以访问到,那another.a也可以访问到,只要它们是同一个类的实例。同一个类的实例对象可以随意调用其他实例的变量或方法。不过这样的代码一般都没有意义。现实生活中异常是equals()(由Eclipse生成, 15 - 18行):

package a;

public class PrivateIsClass {
    private Object object;

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PrivateIsClass other = (PrivateIsClass) obj;
        if (object == null) {
            if (other.object != null)
                return false;
        } else if (!object.equals(other.object))
            return false;
        return true;
    }
}

静态(static)类可能有很多实例

Protection is not object level. It is class level.

访问类型不是对象级别的而是类级别的。

那些不支持有任何实例的类,通常被称为实用工具类。它们只包含静态字段和静态方法以及唯一的不被该类的任何静态方法调用的私有构造函数。在Java 8中也可以有这样的一个野兽(这个词翻译不通,译者注)在接口中实现,因为Java 8的接口可以有静态方法。我不觉得我们应该使用这个特性而不是实用工具类。我也不完全确信我们应该使用实用工具类。

静态类总是在另一个类或接口中。它们是嵌套类。他们是静态的,就像静态方法不能访问类的实例方法和字段一样,静态内部类也不能访问嵌入类的实例方法和字段。这是因为内部类没有嵌入类实例的引用(或者说是指针,如果你喜欢这么叫的话)。内部类(内部类,也即非静态嵌套类, 译者注),而非静态嵌套类, 没有嵌入类的一个实例,它是无法被创建的。每个内部类的实例都具有嵌入类实例的一个引用,因此一个内部类可以访问嵌入类的实例方法和字段。

因为这个原因,要是没有外部类的一个实例,你就不能创建一个内部类。当然,如果是当前对象,也就是this的话,你就可以不需要指定它。在这种情况下你可以使用new, 在这种情况下,也就是this.new的简式。在一个静态的环境中,例如从一个静态方法,你必须指定内部类应该创建哪个封闭类的实例。见第10行:

package a;

class Nesting {
    static class Nested {}
    class Inner {}
    void method(){
        Inner inner = new Inner();
    }
    static void staticMethod(){
        Inner inner = new Nesting().new Inner();
    }
}

匿名类只能访问final变量

Variable has to be effective final

变量必须是有效的final

当一个匿名类被定义在一个方法中,它可以访问局部变量如果该变量是final的。但这说的有点模糊。它们不得不声明成final,他们还必须是有效final。这也是Java 8中发布的一些特性。你不需要声明这些变量为final型,但它们仍然必须是有效的final。

Java 8 does not require final, only effective final

Java 8并不要求final,只要求有效final。

为什么你需要对一些东西声明final,当它被检查必须是这样的。就像方法的参数。它们也必须是final的。你说这不是Java所必须的吗?嗯,你是对的。这只是一个良好的编程风格所必须的。


via: http://www.javacodegeeks.com/2014/11/some-sentences-about-java.html

作者:Peter Verhas 译者:a598799539 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出


当软件出现问题的时候,它应该以一种很容易引起注意的方式马上终止。这种“快速终止”的方式值得借鉴,我们会在这期专栏里谈谈这个重要的概念。

一开始,“快速终止”看上去是一种会影响可靠性的不好的实践——为什么一个系统在还可以继续运行的时候要崩溃(或者说终止)?对于这个,我们需要理解,快速终止是和Heisenbugs(对于不易复现bug的一种称呼)紧密联系在一起的。

考虑一下Bohrbugs(对于能够重现的bug的一种称呼),它们在一个给定输入的条件下总是会出现,比如,访问空指针。这类问题很容易测试、复现并修复。而如今,所有有经验的程序员应该都面对过这样的情形:导致崩溃的bug在重启软件后就不再出现了。不管花多少时间或努力去重现问题,那个bug就是跟我们捉迷藏。这种bug被称为Heisenbugs。

花在寻找、修复和测试Heisenbugs上的努力比起Bohrbugs来说,要高出一个数量级。一种避免Heisenbugs的策略是将它们转化为Bohrbugs。怎么做呢?预测可能导致Heisenbugs的因素,然后尝试将它们变成Bohrbugs。是的,这并不简单,而且也并不是一定可行,但是让我们来看一个能产生效果的特殊例子。

并发编程是Heisenbugs经常出现的一个典范。我们的例子就是一个Java里和并发相关的问题。在遍历一个Java集合的时候,一般要求只能通过Iterator的方法对集合进行操作,比如remove()方法。而在遍历期间,如果有另一个线程尝试修改底层集合(因为编程时留下的错误),那么底层集合就可能会被破坏(例如,导致不正确的状态)。

类似这种不正确的状态会导致不确定的错误——假如我们幸运的话(实际上,这很不幸!),程序可以继续执行而不会崩溃,但是却给出错误的结果。这种bug很难重现和修复,因为这一类的程序错误都是不确定的。换句话说,这是个Heisenbug。

幸运的是,Java Iterators会尝试侦测这种并发修改,并且当发现时,会抛出异常ConcurrentModificationException,而不是等到最后再出错——那样也是没有任何迹象的。换句话说,Java Iterators也遵从了“快速终止”的方法。

如果一个ConcurrentModificationException异常在正式版软件中发生了呢?根据在Javadoc里对这个异常的说明,它“只应该被用于侦测bug”。换句话说,ConcurrentModificationException只应该在开发阶段监听和修复,而不应该泄漏到正式代码中。

好吧,如果正式软件确实发生了这个异常,那它当然是软件中的bug,应当报告给开发者并修复。至少,我们能够知道曾经发生过一次针对底层数据结构的并发修改尝试,而这是软件出错的原因(而不是让软件产生错误的结果,或是以其他现象延后出错,这样就很难跟踪到根本原因)。

“防止崩溃”的途径就意味着开发健壮的代码。一个很好的编写容错代码的例子就是使用断言。很可惜的是,关于断言的使用有大量不必要的公开争论。其中主要的批评点是:它在开发版本中使用,而在发布版中却被关掉的。

不管怎么样,这个批评是错误的:从来没有说要用断言来替代应该放到发布版软件中的防御式检查代码。例如,断言不应该用来检查传递给函数的参数是否为空。相应的,应该用一个if语句来检查这个参数是否正确,否则的话抛出一个异常,或是提前返回,来适合上下文。然而,断言一般可以用于额外检查代码中所作出的假设,这些假设应该一直为真才正常。例如,用一个语句来检查在进行了入栈操作后,栈应该不是空的(例如,对“不变量”的检查)。

所以,快速终止,随时中断,那么你就走在开发更加健壮代码的道路上了。

NoSQL Databases, Java, Terrastore, Neo4j, Voldemort, HBase, InfoGrid, HyperGraphDB, Perst, NeoDatis ODB

NoSQL正在崛起。许多企业和用户已经将MySQL数据库替换成了NoSQL数据库。NoSQL使分析非结构化的数据变得更容易,因此开发者必须意识到存在于NoSQL世界中的趋势和工具。

1.Terrastore

新的文档存储技术可以提供先进的伸缩性和弹性而不必牺牲一致性。Terrastore基于Trrracotta,它依赖于一个业界公认的,快速的(而且又酷)集群技术。

2.Neo4j

开源的图形数据库,用Java实现。开发者将Neo4j描述为“嵌入式,基于磁盘,完全事务的Java持久引擎,将数据结构化存储在图中而不是在二维表格中”

3.Voldemort

分布式键值存储系统。本质上说是一个大型,分布式,持久的,容错哈希表。对于应用,它可以使用类似active-record或者hibernate的O/R映射工具,这些可以提供水平扩展和更高的可用性,但是会损失巨大的便利性。

4.HBase

Apache HBase是Google的Chang et al开发的,是继其开发的分布式存储系统Bigtable之后的另一个开源的、分布式、版本化的、非关系型数据库。

5.InfoGrid

带有很多额外的软件组件的Web图形数据库,使在图形数据库基础上开发Rest-ful的web应用变得很容易。

6.HyperGraphDB

通用的、可扩展、便携、嵌入式、开源数据存储机制。它是一个特别为人工智能和web语义项目设计的图形数据库,同样可以用于不同大小项目的嵌入式面向对象数据库。

7.Perst

Perst是McObject的开源实现,双许可证,面向对象的嵌入式数据库系统(ODBMS)。它的一个版本是用Java开发的嵌入式数据库,另外一个用C#实现(对于Microsoft .NET Framework的应用而言)。

8.NeoDatis ODB

一个简单的运行在Java、.Net、 Google Android、 Groovy 和 Scala上的对象数据库。


via: http://www.efytimes.com/e1/fullnews.asp?edid=138992

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

这篇简短的教程将会演示如何在 Ubuntu 系统中安装 Oracle 公司最新发布的 Java JDK 8。这里使用的方法是教你如何从下载页面下载安装包,然后不使用外部的 PPA 或者第三方源代码在 Ubuntu 中安装。

这种方法不需要依赖于第三方的源仓库。你只需要从 Oracle 的官方下载页直接下载,然后安装就行。

JDK 8 是一个重要的发行版本,也加入了最新的叫做 Lambda 表达式的新语言功能,此功能可以“把函数用作方法参数,或者代码块当作日期数据使用”。

这一个版本也发布了一个新的 java.util.stream 包类集合,提供了基于流的 API,用来支持函数式操作的功能。

关于此次发布版本的更多信息,请访问它的发布主页 @ http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

要下载和安装 Java JDK8,请访问下载页获得最新的发行版本。根据你机器的 Ubuntu 系统的情况可以选择下载 32 位或 64 位的发行版本。

这里是下载页面

在下载之前,您必须接受许可协议。

下载文件,保存。在 Ubuntu 系统中 Firefox 浏览器会默认保存到 ~/Downloads 目录下。

oracle-jdk8-ubuntu

第二步,打开终端运行如下命令来解压下载的文件。

tar -xvf ~/Downloads/jdk-8-linux-x64.tar.gz

然后运行如下的命令,在 /usr/lib 目录中创建一个为保存 Java JDK 8 文件的目录。

sudo mkdir -p /usr/lib/jvm/jdk1.8.0/

接下来运行如下命令把解压的 JDK 文件内容都移动到创建的目录中。

sudo mv jdk1.8.0/* /usr/lib/jvm/jdk1.8.0/

下一步,运行如下命令来配置 Java

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0/bin/java" 1

接下来,拷贝和粘贴下面这一行到终端执行,以启用 Javac 模块。

sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0/bin/javac" 1

最后,拷贝和粘贴下面一行到终端以完成最终的安装。

sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.8.0/bin/javaws" 1

要验证下 Java 是否已经完全安装的话,可以运行下面的命令来测试。

java –version 

祝你玩的开心~


via: http://www.liberiangeek.net/2014/03/daily-ubuntu-tips-manually-install-oracle-java-jdk-8-in-ubuntu/

译者:runningwater 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

问题: 我该如何在 Elemetary OS Luna 上安装Oracle Java 7?

回答: 在 Elementary OS Luna 安装 Java 7 的步骤如下: 由于Elementary OS是基于Ubuntu,所以我们允许使用具有多种Java包的WEPUD8 PPA

  1. 打开终端。
  2. 运行以下指令添加Java的PPA到你的软件仓:
$ sudo add-apt-repository ppa:webupd8team/java

You are about to add the following PPA to your system:
Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK6 / JDK7 / JDK8). There are no actual Java files in this PPA. More info: http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html
Debian installation instructions: http://www.webupd8.org/2012/06/how-to-install-oracle-java-7-in-debian.html
More info: https://launchpad.net/~webupd8team/+archive/java
Press [ENTER] to continue or ctrl-c to cancel adding it
  1. 按回车继续
gpg: keyring `/tmp/tmpB5WwDG/secring.gpg' created
gpg: keyring `/tmp/tmpB5WwDG/pubring.gpg' created
gpg: requesting key EEA14886 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpB5WwDG/trustdb.gpg: trustdb created
gpg: key EEA14886: public key "Launchpad VLC" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK
  1. 现在更新你的系统
$ sudo apt-get update
  1. 运行以下命令安装Java 7:
$ sudo apt-get install oracle-java7-installer

[sudo] password for enock:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
gir1.2-gstreamer-0.10 libilmbase6 libmagickcore4 libmagickwand4 libcdt4
libmagickcore4-extra liblqr-1-0 imagemagick-common libpathplan4 libopenexr6
rsync netpbm libgvc5 libnetpbm10 libgraph4
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
gsfonts-x11 java-common
Suggested packages:
default-jre equivs binfmt-support visualvm ttf-baekmuk ttf-unfonts
ttf-unfonts-core ttf-kochi-gothic ttf-sazanami-gothic ttf-kochi-mincho
ttf-sazanami-mincho ttf-arphic-uming
The following NEW packages will be installed:
gsfonts-x11 java-common oracle-java7-installer
0 upgraded, 3 newly installed, 0 to remove and 196 not upgraded.
Need to get 88.5 kB of archives.
After this operation, 473 kB of additional disk space will be used.
Do you want to continue [Y/n]?
  1. 输入代表Yes的Y以及回车键继续安装。
  2. 在安装过程中,你需要同意条款才能继续。选择OK

  1. 然后选择Yes继续。

  1. 现在请等待安装包的下载与自动安装:

  1. 安装完成。你可以在终端上查看Java版本:
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

via: http://www.unixmen.com/install-oracle-java-7-elementary-os-luna-via-ppa/

译者:whatever1992 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出