Eclipse」カテゴリーアーカイブ

Eclipse(Pleiades)でJDK8

エクリプスのWikiをみてみるとJDK8用のパッチがリリースされている。

というわけで早速入れてみる。

今回の環境は4.3.2ベースのPleiades。Lunaでもいけるらしい。

まず、インストール前の素の状態。

インストール済みJREには設定できるけどランタイムには指定できない。

1

2

 

新規ソフトウェアの追加から次へ次へと行けばいい模様。

Help > Install New Software...
enter the following URL into the 'Work with' field:
http://download.eclipse.org/eclipse/updates/4.3-P-builds/

きっとこれやれば8の指定ができるってことなのだろうとインストールしようとしたら。

3

 

で、依存関係の計算で止まってしまった。

4

 

しばらく放置して進むか確認してみます。。。

っということで放置していたら動きました。

実行環境で8選べるようになってます。

 きしださんのソースをコピらせていただいて軽く動作確認。

package hoge;

import java.util.Arrays;
import java.util.List;

public class Fuga {
	public static void main(String... args){
	    List<String> strs = Arrays.asList("hoge", "foo", "yeah");
	    System.out.println(strs.toString());

	    strs.replaceAll(t -> "** " + t + " **");
	    System.out.println(strs.toString());
	}
}

とりあえず動いているっぽい。

あとは隙間を見つけて。

 

JStyleがエラー

昨日エクリプス(4.3)をアップデートしてからJStyleがエラー。エラー内容は以下。

java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/GC$JStyleSWTBridge
    at jp.sourceforge.mergedoc.jstyle.JStylePlugin.applySWT(JStylePlugin.java:89)
    at jp.sourceforge.mergedoc.jstyle.JStylePlugin.earlyStartup(JStylePlugin.java:81)
    at org.eclipse.ui.internal.EarlyStartupRunnable.runEarlyStartup(EarlyStartupRunnable.java:87)
    at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:66)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2551)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.graphics.GC$JStyleSWTBridge cannot be found by jp.sourceforge.mergedoc.jstyle_4.3.0.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/GC$JStyleSWTBridge
    at jp.sourceforge.mergedoc.jstyle.JStylePlugin.applySWT(JStylePlugin.java:89)
    at jp.sourceforge.mergedoc.jstyle.JStylePlugin.earlyStartup(JStylePlugin.java:81)
    at org.eclipse.ui.internal.EarlyStartupRunnable.runEarlyStartup(EarlyStartupRunnable.java:87)
    at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:66)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2551)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.graphics.GC$JStyleSWTBridge cannot be found by jp.sourceforge.mergedoc.jstyle_4.3.0.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

 

JStyleSWTBridgeというクラスがないと言っている。

Eclipseアップデートした際にあまり注意していなかったけど4.3.0から4.3.1に上がっていて、(Pleiadesにもともと入っていた)JStyle用にカスタマイズされたjarが上書きされてエラーをはいている状況っぽい。

JStyleのページから4.3.1用のものを落としてきて、プラグインフォルダに上書き&4.3.0のJStyle(※)を削除

-clean付きで起動したらOK

自分の環境はWindows7 64bitだけどどのOSでも似たような事象だと思う。

 

propedit(プロパティエディタ)とSysdeo Tomcatが警告残っているので、4.3.1に上げた影響で他にもところどころ直す必要が出てくるかも。

 

※以下のJar

jp.sourceforge.mergedoc.jstyle_4.3.0.0.jar
org.eclipse.swt.win32.win32.x86_64.source_3.102.0.v20130605-1544.jar
org.eclipse.swt.win32.win32.x86_64.source_3.102.0.v20130605-1544.jar.backup
org.eclipse.swt.win32.win32.x86_64_3.102.0.v20130605-1544.jar.backup

 

 

eclipseのglassfish用プラグイン

Eclipseのアップデートを行ったところ「http://dlc.sun.com.edgesuite.net/glassfish/eclipse/kepler/ のリポジトリーが見つかりません。」と怒られた。

 

アドレス少し削って

http://dlc.sun.com.edgesuite.net/glassfish/eclipse/

とすると

Attention – GlassFish plugins will be distributed exclusively as part of the OEPE package.

To get information about OEPE, please visit OEPE page on OTN.

と出てきました。

少し前にtwitterで言ってたかも。。

 

というわけでプラグインから削除

PMDでCUSTOM RULE

昔のブログから引っ越してきた、2011/08/05当時の記事です

 

参考サイトを見ながらぺちぺちとコーディングルール作りの勉強を開始。

今時点でわかったこと
・PMDではチェック対象ソースがツリー状のオブジェクトに変換される。
・ツリー状のオブジェクトに対してXpathやJavaで条件を記載していくことで
ルールを作成できる
・ルールを継承する時の親はAbstractRuleでなくAbstractJavaRuleになっている
・javaで条件を欠く場合は、AbstractJavaRuleがVisterパターンで作られているので
そのvisitに書いていけばよい
・visitの第一引数は色々な型で用意されている。
型はクラスの宣言を表す型等色々あるみたいだが要調査。
・ルールの呼び出しはリンク先のejbrules.xmlをイメージして準備すればよいらしい。(未実行)

######## 親クラス ######
// import net.sourceforge.pmd.AbstractRule; @deprecated
import net.sourceforge.pmd.AbstractJavaRule; // 4.2.5ではこっち

######## もともとのソース ######
package jp.epea;

public class A001 {
/**
* @param args
*/
public static void main(String[] args) {
if(true){

}

}

}

######## ツリー状のソースオブジェクト(実質XML表現:><はエスケープ) ######

 <?xml version="1.0" encoding="UTF-8"?>
<CompilationUnit beginColumn="1" beginLine="1" comments="[net.sourceforge.pmd.ast.FormalComment@aa415d]" endColumn="3" endLine="15" packageDeclaration="PackageDeclaration">
<PackageDeclaration beginColumn="1" beginLine="1" endColumn="16" endLine="1" packageNameImage="jp.epea">
<Name beginColumn="9" beginLine="1" endColumn="15" endLine="1" image="jp.epea"/>
</PackageDeclaration>
<TypeDeclaration beginColumn="1" beginLine="3" endColumn="1" endLine="15">
<ClassOrInterfaceDeclaration abstract="false" beginColumn="8" beginLine="3" endColumn="1" endLine="15" final="false" image="A001" interface="false" modifiers="1" native="false" nested="false" packagePrivate="false" private="false" protected="false" public="true" static="false" strictfp="false" synchronized="false" transient="false" volatile="false">
<ClassOrInterfaceBody beginColumn="19" beginLine="3" endColumn="1" endLine="15">
<ClassOrInterfaceBodyDeclaration anonymousInnerClass="false" beginColumn="5" beginLine="8" endColumn="5" endLine="13" enumChild="false">
<MethodDeclaration abstract="false" beginColumn="19" beginLine="8" block="Block" endColumn="5" endLine="13" final="false" interfaceMember="false" methodName="main" modifiers="17" native="false" packagePrivate="false" private="false" protected="false" public="true" resultType="ResultType" static="true" strictfp="false" synchronized="false" syntacticallyAbstract="false" syntacticallyPublic="true" transient="false" void="true" volatile="false">
<ResultType beginColumn="19" beginLine="8" endColumn="22" endLine="8" void="true"/>
<MethodDeclarator beginColumn="24" beginLine="8" endColumn="42" endLine="8" image="main" parameterCount="1">
<FormalParameters beginColumn="28" beginLine="8" endColumn="42" endLine="8" parameterCount="1">
<FormalParameter abstract="false" array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="41" endLine="8" final="false" modifiers="0" native="false" packagePrivate="true" private="false" protected="false" public="false" static="false" strictfp="false" synchronized="false" transient="false" typeNode="Type" varargs="false" volatile="false">
<Type array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="36" endLine="8" typeImage="String">
<ReferenceType array="true" arrayDepth="1" beginColumn="29" beginLine="8" endColumn="36" endLine="8">
<ClassOrInterfaceType beginColumn="29" beginLine="8" endColumn="34" endLine="8" image="String"/>
</ReferenceType>
</Type>
<VariableDeclaratorId array="false" arrayDepth="0" beginColumn="38" beginLine="8" endColumn="41" endLine="8" exceptionBlockParameter="false" image="args" typeNameNode="ReferenceType" typeNode="Type"/>
</FormalParameter>
</FormalParameters>
</MethodDeclarator>
<Block beginColumn="44" beginLine="8" endColumn="5" endLine="13">
<BlockStatement allocation="false" beginColumn="9" beginLine="9" endColumn="9" endLine="11">
<Statement beginColumn="9" beginLine="9" endColumn="9" endLine="11">
<IfStatement beginColumn="9" beginLine="9" endColumn="9" endLine="11">
<Expression beginColumn="12" beginLine="9" endColumn="15" endLine="9">
<PrimaryExpression beginColumn="12" beginLine="9" endColumn="15" endLine="9">
<PrimaryPrefix beginColumn="12" beginLine="9" endColumn="15" endLine="9">
<Literal beginColumn="12" beginLine="9" charLiteral="false" endColumn="15" endLine="9" floatLiteral="false" intLiteral="false" singleCharacterStringLiteral="false" stringLiteral="false">
<BooleanLiteral beginColumn="12" beginLine="9" endColumn="15" endLine="9" true="true"/>
</Literal>
</PrimaryPrefix>
</PrimaryExpression>
</Expression>
<Statement beginColumn="17" beginLine="9" endColumn="9" endLine="11">
<Block beginColumn="17" beginLine="9" endColumn="9" endLine="11"/>
</Statement>
</IfStatement>
</Statement>
</BlockStatement>
</Block>
</MethodDeclaration>
</ClassOrInterfaceBodyDeclaration>
</ClassOrInterfaceBody>
</ClassOrInterfaceDeclaration>
</TypeDeclaration>
</CompilationUnit>

エクリプスプラグイン

昔のブログから引っ越してきた、2011/07/29当時の記事です

ThinkITの記事を見つつ(リンク切れ)HelloWorldコマンドプラグインでベースを作成。

やるべきことは技術的には

  1. 1.eclipse上の選択フォルダを取得する
  2. ファイル一覧を取得する
  3. 既存ファイルを削除する
  4. ファイルをコピーする

ぐらい。

1.eclipse上の選択フォルダを取得する

execute(ExecutionEvent event) { //で ISelection currentSelections = HandlerUtil.getCurrentSelection(event); // 選択取得

//  ISelection 継承したインターフェースは現在はIStructuredSelectionだけ

// 配下はiterator()で回すとObject型でとれる
IStructuredSelection sSelection = (IStructuredSelection) currentSelections;
for (Iterator iterator = sSelection.iterator(); iterator.hasNext();) {

// オブジェクトをキャストして選択を取得
IFolder selectedFolder = (IFolder) selectedObj;

とれるものは下のもの。
/**
* Type constant (bit mask value 1) which identifies file resources.
*
* @see IResource#getType()
* @see IFile
*/
public static final int FILE = 0x1;

/**
* Type constant (bit mask value 2) which identifies folder resources.
*
* @see IResource#getType()
* @see IFolder
*/
public static final int FOLDER = 0x2;

/**
* Type constant (bit mask value 4) which identifies project resources.
*
* @see IResource#getType()
* @see IProject
*/
public static final int PROJECT = 0x4;

ルートはIResourceの方にあるけどC:\のようなファイルシステム上のルートを表すので
ワークベンチの選択では飛んでこない(はず。。)
/**
* Type constant (bit mask value 8) which identifies the root resource.
*
* @see IResource#getType()
* @see IWorkspaceRoot
*/
public static final int ROOT = 0x8;

eclipse起動直後の何も選択していない状態はnullでなく空のイテレーターだった。

2.ファイル一覧を取得する

IFolder extends IContainer extends IResourceで
(意味はあとで見てもわかるはず。親の親)
IContainer.members()で直下のリソース(フォルダ内なのでフォルダかファイル)が取得できる
直下のみなので配下一覧を取得する場合は再帰処理

private void getFileList(IFolder tartgetFolder, List fileList) throws CoreException {
{
assert tartgetFolder != null;
assert fileList != null;
}

IResource[] members = tartgetFolder.members();
for(IResource currentResource : members ){
if( currentResource.getType() == IResource.FOLDER ) {
getFileList( (IFolder)currentResource, fileList);

} else if(currentResource.getType() == IResource.FILE ){
IFile currentFile = (IFile)currentResource;
if(isCopyTarget(currentFile)) fileList.add( currentFile );
}
}
}

3.既存ファイルを削除する

currentFile.delete(true, null);
で削除。
一個目の引数はファイルシステムと同期できていない場合に削除するか
二個目の引数はモニター(?)を使うためのもの。進捗状況ビュー???

private void deleteOldImages(IContainer tartgetFolder) throws CoreException {

IResource[] members = tartgetFolder.members();
for(IResource currentResource : members){
if( currentResource.getType() != IResource.FILE ) continue;// リソースの種類
IFile currentFile = (IFile)currentResource;
if( this.isRemoveTarget(currentFile) )
currentFile.delete(true, null);
}
}

4.ファイルをコピーする

コピーしたいファイルオブジェクトの、コピーメソッドを呼び出す。
引数のバージョンはあるけど使ったのは以下。
currentFile.copy(targerFolderPath.append(sbFileName.toString()), true, null);

第一引数はファイルのパスオブジェクト(IPath )
パスオブジェクトは
IResource.getFullPathでプロジェクト名を起点としたパス
IResource.getLocationはローカルのファイルシステムを起点としたパス(c:\~)

第二引数はファイルシステムと同期できていない場合に削除するか
第三引数はモニター(?)を使うためのもの。進捗状況ビュー???

IResource.getFullPath
IResource.getLocation

※↓の定数はAPIのでなく自分で宣言したもの
private void copyTargetFileList(IContainer tartgetFolder, List targetFileList) throws CoreException {

StringBuffer sbFileName = new StringBuffer();

IPath targerFolderPath = tartgetFolder.getFullPath();

for( IFile currentFile: targetFileList ){
String[] segmentArray = currentFile.getFullPath().removeFirstSegments(SEGMENT_INDEX_DRAWABLE + 1 ).segments();
for( int arrayIndex = 0 ; arrayIndex < segmentArray.length; arrayIndex++){
sbFileName.append(segmentArray[arrayIndex]);
if( arrayIndex != segmentArray.length -1 ) sbFileName.append(FILE_DELIMITER);
}

currentFile.copy(targerFolderPath.append(sbFileName.toString()), true, null);

sbFileName.delete(0, sbFileName.length());
}

}

Fileに色々な属性があるので、この通りに動かないことも多いけどベースはこんな感じで。

 

 

M2E(Maven)のproperty外部化

以前JavaFXのMaven設定を行った際にjfxrt.jarへのパスはpomに直接記載していた。別端末(別のパス)で使用しようとしたときに外部化した際の手順。

 

設定を記載するsetting.xmlを作成。(proxyを使う際等に既に作っていることも多い。)

Defaultは下。(自分はEclipseの設定->Maven->ユーザ設定から変更)

    The Maven install: $M2_HOME/conf/settings.xml
    A user's install: ${user.home}/.m2/settings.xml

作成した内容は以下。

profile -> propertiesの下に、キー、値を指定する。

(参考サイト

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline/>
  <pluginGroups/>
  <servers/>
  <mirrors/>
  <proxies/>
    <profiles>
        <profile>
            <id>javafx2</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <javafx2.home>C:\develop\pleiades43\pleiades\java\7\lib\jfxrt.jar</javafx2.home>
            </properties>
        </profile>
    </profiles>
  <activeProfiles/>
</settings>

pomで直接記載していた個所が変数で指定できるようになっている。

 

     <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>javafx</artifactId>
            <version>2.0</version>
            <scope>system</scope>
            <systemPath>${javafx2.home}</systemPath>
        </dependency>

 

今回参考にさせてもらったビルドまで記載されているブログ